Я буду переименовывать переменные, чтобы уменьшить путаницу. n -> nf или nmain . x -> xf или 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()
Когда вы вызываете функцию f , среда выполнения Python делает копию xmain и присваивает ей xf , а также назначает копию nmain до nf .
В случае n копируемое значение равно 1.
В случае x копируемое значение равно , а не буквенный список [0, 1, 2, 3] . Это ссылка на этот список. xf и xmain указывают на один и тот же список, поэтому при изменении xf вы также изменяете xmain .
Если, однако, вы должны были написать что-то вроде:
xf = ["foo", "bar"]
xf.append(4)
вы обнаружите, что xmain не изменился. Это потому, что в строке xf = ["foo", "bar"] вы изменили xf , чтобы указать на новый список. Любые изменения, внесенные вами в этот новый список, не окажут влияния на список, на который все еще указывает xmain .
Надеюсь, это поможет. : -)