python: Thêm từ điển vào danh sách - tôi thấy hành vi giống như con trỏ


85

Tôi đã thử những điều sau trong trình thông dịch python:

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

Ở đây, sau khi thêm từ điển 'b' vào danh sách 'a', tôi đang thay đổi giá trị tương ứng với khóa 1 trong từ điển 'a'. Bằng cách nào đó, thay đổi này cũng được phản ánh trong danh sách. Khi tôi nối từ điển vào danh sách, tôi không chỉ thêm giá trị của từ điển? Có vẻ như tôi đã thêm một con trỏ vào từ điển vào danh sách và do đó những thay đổi đối với từ điển cũng được phản ánh trong danh sách.

Tôi không muốn thay đổi được phản ánh trong danh sách. Tôi phải làm nó như thế nào?

Cảm ơn bạn đã dành thời gian!


Chekhov Nó không phải từ điển 'b' , nó là từ điển b hoặc từ điển tên 'b' . Nhân tiện, bạn đã viết nhầm: "Tôi đang thay đổi giá trị tương ứng với khóa 1 trong từ điển 'a'" Không, trong từ điển b. Liên quan đến sự ngạc nhiên của bạn: một danh sách không chứa giá trị, nó chứa các đối tượng, vì tất cả đều là đối tượng trong Python. Hay chính xác hơn là một danh sách chứa các tham chiếu đến các đối tượng.
eyquem

Chekhov Bạn cũng sẽ thấy câu hỏi này: ( stackoverflow.com/questions/5242933/… )
eyquem Ngày

@eyquem cảm ơn bạn đã bình luận. Tôi đã đăng cái này một cách vội vàng. Lời xin lỗi của tôi.
neo29

Chekhov Đó không phải là một lời trách móc, nó chỉ là thông tin. Nhân tiện, nếu câu trả lời của tôi có phần hữu ích, nó có thể được ủng hộ. Ngoài ra, bạn có thể chọn "chấp nhận" một câu trả lời trong số các câu trả lời, bằng cách nhấp vào sọc hình chữ V dưới bộ đếm điểm ở bên trái của một câu trả lời, nó sẽ được 25 điểm. Hoặc bạn có thể chọn không chấp nhận bất kỳ câu hỏi nào.
eyquem

Câu trả lời:


140

Bạn đã chính xác ở chỗ danh sách của bạn chứa tham chiếu đến từ điển gốc.

a.append(b.copy()) nên làm thủ thuật.

Hãy nhớ rằng điều này tạo ra một bản sao nông cạn. Một giải pháp thay thế là sử dụng copy.deepcopy(b), tạo một bản sao sâu.


6
tuyệt vời! Tôi đã bị chặn trong một thời gian dài về điều này
Yasin

2
điều này đã làm tôi suy nghĩ trong khoảng nửa giờ cho đến khi tôi bỏ cuộc và quyết định kiểm tra ngăn xếp.
FlyingZebra1

35

Ngoài ra với dict

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

kết quả

[{1: 'one'}]
[{1: 'one'}]

Không chắc liệu nó có đủ nhanh như copy () hay không, nhưng có vẻ nhanh hơn deepcopy (). Có thể với lược đồ từ điển phức tạp, nó sẽ gần giống với deepcopy () vì dict () tạo một từ điển mới.
selotec

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.