2016-10-03 133 views
-1

screenshot of code from a textbook更改函數中的全局變量,而無需使用global關鍵字

這裏是我的代碼:

def L_value_Change(k): 
    global L 
    L = k 
    return L 

def applyF_filterG(L, f, g): 
    L 
    k = [] 
    for i in L: 
     if g(f(i)): 
      k.append(i) 
    L = k 
    L_value_Change(k) 
    if L == []: 
     return -1 
    else : 
     return max(L) 

當我把這個代碼,平地機告訴我這是不正確!所以我讀了測驗的介紹,導師寫道「全局變量不起作用」。如何在不使用單詞global的情況下使用函數更改L變量?如果你嘗試了我的代碼並給了它所需的輸入,它會給你一個正確的答案,但是分級者告訴我這是錯誤的。

+1

我想人們不喜歡這張照片,但對我來說這似乎是一個合理的問題! – tdelaney

+0

歡迎來到Stack Overflow!如果他們不能以文本形式發佈(可讀,可搜索等),則以圖片形式提供信息。 –

回答

2

當您想要將全局變量重新綁定到其他對象時,您需要使用global關鍵字。但如果你想要做的只是改變一個可變對象,你不需要它。在你的情況下,L是一個列表,可以通過分片操作L[:] = k進行變異。爲了證明:

>>> L = [1,2,3] 
>>> 
>>> def L_value_Change(k): 
...  L[:] = k 
... 
>>> old_id = id(L) 
>>> L 
[1, 2, 3] 
>>> L_value_Change([4,5,6]) 
>>> assert id(L) == old_id 
>>> L 
[4, 5, 6] 
>>> 
2

列表是可變對象,正因爲如此,要改變他們所有你需要做的只是將它們作爲參數傳遞給函數。

def f(i): 
    return i + 2 

def g(i): 
    return i > 5 

l = [0, -10, 5, 6, -4] 
def applyF_filterG(L, f, g): 
    for val in L[:]: 
     if not g(f(val)): 
      L.remove(val) 
    return -1 if not L else max(L)  

print(l) # [0, -10, 5, 6, -4] 
applyF_filterG(l, f, g) # Return 6 
print(l) # [5, 6] 
0

這是我的代碼,它可以避免在列表上進行變異,試圖迭代。

def applyF_filterG(L,f,g): 
     """ 
     Assumes L is a list of integers 
     Assume functions f and g are defined for you. 
     f takes in an integer, applies a function, returns another integer 
     g takes in an integer, applies a Boolean function, 
      returns either True or False 
     Mutates L such that, for each element i originally in L, L contains 
      i if g(f(i)) returns True, and no other elements 
     Returns the largest element in the mutated L or -1 if the list is empty 
     """ 
     # Applying the functions & Mutating L 
     i = len(L)-1 
     largestnum=0 
     if (len(L)==0): 
      return -1 
     else: 
      while i>=0: 
       if not g(f(L[i])): 
        del L[i] 
       i-=1  

     #Finding the largest number 
     if not L: 
      return -1 
     if (len(L)==1): 
      return L[0] 
     else: 
      for num in range(len(L)-1): 
       if (L[num]>L[num+1]): 
        largestnum=L[num] 
       else: 
        largestnum=L[num+1] 
      return largestnum  
相關問題