Schreiben (und nicht) in eine globale Variable in Python

Ich komme aus viel weniger dynamischem C ++ und habe Probleme, das Verhalten dieses Python (2.7) -Codes zu verstehen.

Hinweis: Mir ist bewusst, dass dies ein schlechter Programmierstil ist, aber ich würde es trotzdem gerne verstehen.

vals = [1,2,3]

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

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

Dieser Code wird ohne Fehler ausgeführtf manipuliert die (scheinbar) globale Liste. Dies steht im Widerspruch zu meinem vorherigen Verständnis, dass globale Variablen, die in einer Funktion manipuliert (und nicht nur gelesen) werden sollen, als deklariert werden müssenglobal ....

Auf der anderen Seite, wenn ich ersetzevals[0] = 5 mitvals += [5,6]schlägt die Ausführung mit einem fehlUnboundLocalError es sei denn, ich füge einglobal vals zuf. Dies hätte ich auch im ersten Fall erwartet.

Könnten Sie dieses Verhalten erklären?

Warum kann ich manipulieren?vals im ersten Fall? Warum schlägt die zweite Art der Manipulation fehl, die erste nicht?

Aktualisieren: Es wurde in einem Kommentar darauf hingewiesenvals.extend(...) funktioniert ohneglobal. Dies trägt zu meiner Verwirrung bei - warum ist das so?+= anders behandelt als ein Anruf anextend?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage