Tôi sẽ đổi tên các biến để giảm nhầm lẫn. n -> nf hoặc nmain . x -> xf hoặc 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()
Khi bạn gọi hàm f , bộ thực thi Python tạo một bản sao của xmain và gán nó cho xf , và tương tự gán một bản sao của nmain cho nf .
Trong trường hợp n , giá trị được sao chép là 1.
Trong trường hợp x giá trị được sao chép không phải là danh sách bằng chữ [0, 1, 2, 3] . Nó là một tài liệu tham khảo cho danh sách đó. xf và xmain đang trỏ vào cùng một danh sách, vì vậy khi bạn sửa đổi xf, bạn cũng đang sửa đổi xmain .
Tuy nhiên, nếu bạn đã viết một cái gì đó như:
xf = ["foo", "bar"]
xf.append(4)
bạn sẽ thấy rằng xmain đã không thay đổi. Điều này là do, trong dòng xf = ["foo", "bar"] bạn đã thay đổi xf để trỏ đến một danh sách mới . Mọi thay đổi bạn thực hiện cho danh sách mới này sẽ không có hiệu ứng nào trong danh sách mà xmain vẫn chỉ đến.
Mong rằng sẽ giúp. :-)