2015-03-02 2 views
3

Это может быть очень глупый вопрос, но я немного не уверен, почему списки ведут себя по-другому с другими переменными в Python 3 в отношении области видимости. В следующем коде ...Сфера охвата списков в Python 3

foo = 1 
bar = [1,2,3,4] 

def baz(): 
    foo += 1 
    bar[0]+=1 

Я понимаю, почему foo += 1 выдает ошибку в отношении к foo будучи за пределами локальной области видимости. Почему же bar[0]+=1 не ошибается?

+0

потому что 'bar [0]' - выражение, которое читает 'bar', которое разрешено в python. – HuStmpHrrr

ответ

1

При выполнении кода, вы получите

.... 
    foo += 1 
UnboundLocalError: local variable 'foo' referenced before assignment 

foo += 1 фактически оценивается как это. foo = foo + 1. Итак, вы добавляете 1 в значение foo и сохраняете его в переменной foo. Поскольку существует задание, Python предполагает, что foo является локальной переменной. Но, если это локальная переменная, в выражении foo + 1, каково будет значение foo? Питон не мог ответить на этот вопрос. Вот почему это порождает эту ошибку.

Но, когда вы делаете bar[0] += 1, Python оценивает это как это bar[0] = bar[0] + 1. Поскольку он уже знает, что такое bar, и вы просто пытаетесь заменить первый элемент в нем, он позволяет это. В последнем случае мы создали новую локальную переменную foo, выполнив foo += 1, но здесь мы просто изменяем один и тот же объект. Таким образом, Python позволяет это.

1

Переменная foo указывает на объект (целое число). Переменная baz указывает на объект (список). Если вы попытаетесь переназначить baz другому объекту, вы получите ошибку. Но это не так, вы просто вызываете метод в объекте списка, и каждый может это сделать.

1

В python вы не можете изменять глобальные переменные без «глобального» ключевого слова. Это для ясности.

foo=1 
def bar(): 
    global foo 
    foo=2 
bar() 
#foo is now 2! 

Так как бар [0] + = Foo изменяет элемент списка, а не значение самой переменной списка, он является законным.

Смежные вопросы