Запись (и не) в глобальную переменную в 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

Ответы на вопрос(3)

Ваш ответ на вопрос