Ich werde Variablen umbenennen, um Verwirrung zu vermeiden. n -> nf oder nmain . x -> xf oder xmain :
def f(nf, xf):
nf = 2
xf.append(4)
print 'In f():', nf, xf
def main():
nmain = 1
xmain = [0,1,2,3]
print 'Before:', nmain, xmain
f(nmain, xmain)
print 'After: ', nmain, xmain
main()
Wenn Sie die Funktion f aufrufen , erstellt die Python-Laufzeit eine Kopie von xmain und weist sie xf zu . In ähnlicher Weise weist sie nf eine Kopie von nmain zu .
Im Fall von n ist der kopierte Wert 1.
Im Fall von x ist der kopierte Wert nicht die Literalliste [0, 1, 2, 3] . Es ist ein Verweis auf diese Liste. xf und xmain zeigen auf dieselbe Liste. Wenn Sie also xf ändern, ändern Sie auch xmain .
Wenn Sie jedoch etwas schreiben würden wie:
xf = ["foo", "bar"]
xf.append(4)
Sie würden feststellen, dass sich xmain nicht geändert hat. Dies liegt daran, dass Sie in der Zeile xf = ["foo", "bar"] xf so geändert haben, dass es auf eine neue Liste verweist . Alle Änderungen, die Sie an dieser neuen Liste vornehmen, haben keine Auswirkungen auf die Liste, auf die xmain noch verweist.
Hoffentlich hilft das. :-)