2016-10-03 4 views
-1

screenshot of code from a textbookИзменение глобальной переменной в функции без использования глобального ключевого слова

Вот мой код:

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) 

Когда я ставлю этот код, грейдер говорит мне, что это неправильно! Поэтому я прочитал введение в викторину, инструктор написал, что «глобальные переменные не работают». Как я могу изменить переменную L с функцией без использования слова global? Если вы попробуете мой код и дадите ему необходимый ввод, он даст вам правильный ответ, но грейдер скажет мне, что это неправильно.

+1

Я думаю, людям не понравилась картина, но мне кажется, что это разумный вопрос! – tdelaney

+0

Добро пожаловать в переполнение стека! Предоставляйте информацию как изображение, если они не могут быть размещены как текст (читаемый, доступный для поиска и т. Д.). –

ответ

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