Запись (и не) в глобальную переменную в Python
Исходя из гораздо менее динамичного C ++, у меня возникли проблемы с пониманием поведения этого кода Python (2.7).
Замечания: Я знаю, что это плохой стиль программирования / зло, но я хотел бы понять это, тем не менее.
vals = [1,2,3]
def f():
vals[0] = 5
print 'inside', vals
print 'outside', vals
f()
print 'outside', vals
Этот код работает без ошибок, иf
манипулирует (казалось бы) глобальным списком. Это противоречит моему предварительному пониманию того, что глобальные переменные, которыми нужно манипулировать (а не только читать) в функции, должны быть объявлены как.global ...
С другой стороны, если я заменюvals[0] = 5
сvals += [5,6]
выполнение не выполняется сUnboundLocalError
если я не добавлюglobal vals
вf
, Это то, что я ожидал бы произойти и в первом случае.
Не могли бы вы объяснить это поведение?
Почему я могу манипулироватьvals
в первом случае? Почему второй тип манипуляции терпит неудачу, а первый нет?
Обновить: Это было отмечено в комментарии,vals.extend(...)
работает безglobal
, Это добавляет к моей путанице - почему+=
относиться по-другому от вызова к? Я 'extend