Zmienię nazwy zmiennych, aby zmniejszyć zamieszanie. n -> nf lub nmain . x -> xf lub 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()
Kiedy wywołujesz funkcję f , środowisko uruchomieniowe Pythona tworzy kopię xmain i przypisuje ją do xf oraz podobnie przypisuje kopię nmain do nf .
W przypadku n kopiowana wartość to 1.
W przypadku x kopiowana wartość nie jest listą literałów [0, 1, 2, 3] . Jest to odniesienie do tej listy. xf i xmain wskazują na tę samą listę, więc modyfikując xf , modyfikujesz również xmain .
Gdybyś jednak miał napisać coś takiego:
xf = ["foo", "bar"]
xf.append(4)
przekonasz się, że xmain się nie zmienił. Dzieje się tak, ponieważ w wierszu xf = ["foo", "bar"] zmieniono xf, aby wskazywał na nową listę. Wszelkie zmiany wprowadzone na nowej liście nie będą miały wpływu na listę, na którą xmain nadal wskazuje.
Mam nadzieję, że to pomoże. :-)