Je renommerai les variables pour réduire la confusion. n -> nf ou nmain . x -> xf ou 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()
Lorsque vous appelez la fonction f , le runtime Python fait une copie de xmain et l'affecte à xf , et affecte de la même manière une copie de nmain à nf .
Dans le cas de n , la valeur copiée est 1.
Dans le cas de x, la valeur copiée n'est pas la liste littérale [0, 1, 2, 3] . C'est une référence à cette liste. xf et xmain pointent sur la même liste, donc lorsque vous modifiez xf, vous modifiez également xmain .
Si, cependant, vous deviez écrire quelque chose comme:
xf = ["foo", "bar"]
xf.append(4)
vous constaterez que xmain n'a pas changé. C'est parce que, dans la ligne xf = ["foo", "bar"], vous avez changé xf pour pointer vers une nouvelle liste. Toutes les modifications que vous apportez à cette nouvelle liste n'auront aucun effet sur la liste vers laquelle pointe toujours xmain .
J'espère que cela pourra aider. :-)