2016-10-03 124 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  
相关问题