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
?