Zapisywanie (i nie) do zmiennej globalnej w Pythonie

Pochodząc z dużo mniej dynamicznego C ++, mam pewne problemy ze zrozumieniem zachowania tego kodu Pythona (2.7).

Uwaga: Zdaję sobie sprawę, że jest to zły styl programowania / zło, ale chciałbym to zrozumieć nie mniej.

vals = [1,2,3]

def f():
    vals[0] = 5
    print 'inside', vals

print 'outside', vals
f()
print 'outside', vals

Ten kod działa bez błędu if manipuluje (pozornie) globalną listą. Jest to sprzeczne z moim wcześniejszym zrozumieniem, że zmienne globalne, które mają być manipulowane (i nie tylko odczytywane) w funkcji, muszą być zadeklarowane jakoglobal ....

Z drugiej strony, jeśli wymienięvals[0] = 5 zvals += [5,6], wykonanie kończy się niepowodzeniemUnboundLocalError chyba że dodamglobal vals dof. Tego właśnie oczekiwałbym również w pierwszym przypadku.

Czy mógłbyś wyjaśnić to zachowanie?

Dlaczego mogę manipulowaćvals w pierwszym przypadku? Dlaczego drugi rodzaj manipulacji zawodzi, a pierwszy nie?

Aktualizacja: Zostało to zauważone w komentarzuvals.extend(...) działa bezglobal. To dodaje mi zamieszania - dlaczego tak jest+= traktowane inaczej niż połączenieextend?

questionAnswers(3)

yourAnswerToTheQuestion