Tôi hiểu rằng del d[key]
sẽ xóa cặp khóa-giá trị, trong khi d[key]=None
chỉ không tham chiếu giá trị.Mức tiêu thụ bộ nhớ của từ điển: đặt giá trị Không so với xóa mục
Tuy nhiên, về quản lý bộ nhớ, có sự khác biệt nào không? Không đặt giá trị ngay lập tức cho bộ sưu tập rác kích hoạt None
, giả sử rằng không có biến nào khác tham chiếu giá trị này?
Tôi chạy một chút thí nghiệm:
In [74]: import sys
In [75]: a = {'a': 'blah'}
In [76]: sys.getsizeof(a)
Out[76]: 280
In [77]: a['a'] = None
In [79]: sys.getsizeof(a)
Out[79]: 280
In [80]: del a['a']
In [81]: sys.getsizeof(a)
Out[81]: 280
Không chắc chắn nếu phương pháp này là hợp lệ, nhưng có vẻ như không có sự khác biệt về kích thước của từ điển ở tất cả. Tôi phải bỏ lỡ một cái gì đó ở đây.
Có giá trị '' None'' vẫn có nghĩa là từ điển phải có tham chiếu đến khóa được liên kết với tham chiếu đến '' None'', việc xóa giá trị sẽ xóa nó khỏi dict hoàn toàn. Chúng là các hoạt động hoàn toàn khác nhau và không tương đương với nhau. –
Một đối tượng 'dict' bao gồm' smalltable' cho tối đa 5 mục (có kích thước cho 8 mục, nhưng nó chỉ có thể là 2/3 đầy đủ). Bảng phát triển trong quyền hạn của 2, bắt đầu từ 8. Trên một hệ thống 32-bit một 'PyDictEntry' là 12 byte, do đó,' smalltable' là 96 byte, cộng với 28 byte trong lĩnh vực othe, đến 124 byte. 'sys.getizeof' cũng báo cáo 12 byte được thêm vào dict để theo dõi GC ('gc_next',' gc_prev', 'gc_refs'), tạo tổng kích thước 136 byte. GC xử lý các chu kỳ tham chiếu có thể ngăn chặn các vùng chứa không thể truy cập (ví dụ: các dicts, classes) khỏi bị deallocated. – eryksun
@Lattyware: OP không nói rằng chúng tương đương nhau, anh ta nói rằng 'd [key] = None' không tham chiếu giá trị, điều này đúng. –