Я перейменую змінні, щоб зменшити плутанину. 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 .
Сподіваюся, що це допомагає. :-)