2014-04-30 44 views
10

Vấn đềNối giá trị cho một danh sách trong từ điển gắn thêm giá trị cho tất cả các danh sách trong từ điển

tôi đang tạo ra một từ điển với danh sách trống rỗng như các giá trị theo cách sau.

>>> words = dict.fromkeys(['coach', 'we', 'be'], []) 

Từ điển trông như thế này.

>>> words 
{'coach': [], 'be': [], 'we': []} 

Khi tôi thêm giá trị vào một danh sách, giá trị được thêm vào tất cả giá trị trong ví dụ này.

>>> words['coach'].append('test') 
{'coach': ['test'], 'be': ['test'], 'we': ['test']} 

Các Câu hỏi

Câu hỏi của tôi có hai phần. Đầu tiên, tại sao điều này lại xảy ra? Thứ hai, tôi có thể làm gì với nó? Đó là, làm thế nào tôi có thể nối thêm một giá trị vào chỉ một danh sách?

Tôi tưởng tượng rằng khi tạo từ điển, tôi đã tạo tất cả các danh sách trỏ đến cùng một đối tượng. Nhưng tôi không hiểu điều đó có thể là vì khi tôi nhập 0 thay vì [] trong tạo từ điển và sau đó thêm giá trị thay vì nối thêm chúng, các giá trị hoạt động khác nhau như thể chúng trỏ đến các đối tượng riêng biệt.

Tôi sẽ đánh giá cao mọi đầu vào. Cảm ơn bạn trước!

Trả lời

18

dict.fromkeys sử dụng cùng đối tượng cho tất cả các giá trị, trong trường hợp này một danh sách mutable ... Điều đó có nghĩa, tất cả các phím chia sẻ cùng một danh sách rỗng ... Khi bạn cố gắng .append với giá trị của một danh sách , các thay đổi được thực hiện tại chỗ cho đối tượng, do đó, các thay đổi đối với đối tượng sẽ hiển thị với tất cả các tham chiếu đó.

Nếu thay vào đó bạn sử dụng một dict-comp, ví dụ như: {k:[] for k in ['could', 'we', 'be']} mỗi [] là một khác nhau danh sách trống và như vậy sẽ là duy nhất cho mỗi giá trị quan trọng và làm việc như mong đợi.

Liên quan đến sử dụng dict.fromkeys(['a', 'b', 'c'], 0) các 0 là một bất biến đối tượng do đó không phụ thuộc vào Gotcha mà như thay đổi nó gây ra đối tượng mới, không phải là một sự thay đổi cho các đối tượng cơ bản đó khác nhau tên (trong trường hợp này - giá trị của các khóa khác nhau) có thể chia sẻ.

Các vấn đề liên quan