Tôi rất bối rối bởi hành vi bên dưới. Các trường hợp 1, 3 và 4 thực hiện như tôi mong đợi, nhưng trường hợp 2 thì không. Tại sao trường hợp 2 cho phép hàm thay đổi giá trị của mục nhập từ điển trên toàn cầu, mặc dù từ điển không bao giờ được hàm trả về? Lý do chính mà tôi đang sử dụng các hàm là cô lập mọi thứ trong hàm từ phần còn lại của mã, nhưng điều này dường như không thể nếu tôi chọn sử dụng cùng tên biến bên trong hàm. Tôi đã hiểu rằng bất cứ điều gì được định nghĩa rõ ràng trong một hàm là cục bộ cho hàm đó, nhưng điều này dường như không phải là trường hợp nếu từ điển là được xác định và được truyền làm đầu vào cho hàm.Từ điển python được truyền dưới dạng đầu vào cho một hàm hoạt động như một hàm toàn cầu trong hàm đó chứ không phải là một địa phương
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
============= Trường hợp 1 ===============
>>> def testfun1(a):
... a=2
...
>>> a=0
>>> testfun1(a)
>>> a
0
====== ======= Trường hợp 2 ===============
>>> def testfun2(b):
... b['test']=2
...
>>> b={}
>>> testfun2(b)
>>> b
{'test': 2}
============= Trường hợp 3 ==== ===========
>>> def testfun3():
... c=2
...
>>> c=0
>>> testfun3()
>>> c
0
============= Trường hợp 4 =============== (giải thích bằng câu hỏi này: Global dictionaries don't need keyword global to modify them?)
>>> def testfun4():
... d['test']=10
...
>>> d={}
>>> testfun4()
>>> d
{'test': 10}
để sao chép từ điển, bạn nên sử dụng phương pháp sao chép bản sao của mô-đun sao chép ** copy.deepcopy (d) ** trả về bản sao sâu của d. để biết thêm thông tin về nông sâu và sâu, xin vui lòng tham khảo https://docs.python.org/2/library/copy.html –
@PavanGupta Điều đó tất cả phụ thuộc vào cách 'sâu' của một bản sao bạn muốn. Nếu bạn có một dict có giá trị cũng là dicts, bạn có muốn tạo bản sao của những dicts, hoặc chỉ cho họ. Quy tắc/câu hỏi này áp dụng đệ quy. – Darthfett