[英]Difference between setdefaultkey() and just checking if a value already exists in a dictionary?
最近,我試圖在我的 python 代碼中修復 memory 泄漏,我設法確定泄漏的來源來自這段代碼(抽象):
>>> values = list
>>> a = dict
if key in a:
a[key].extend(values)
else:
a[key] = values
有人建議我應該改用setdefaultkey()
。 實施后,我的 memory 泄漏已修復:
a.setdefaultkey(key,[])
a[key].extend(values)
但我真的不明白為什么。 有人能解釋一下為什么我的第一個代碼會創建沒有被正確垃圾收集的對象,以及后面的代碼有什么區別嗎?
我之所以這樣問,部分是出於好奇,部分是因為我需要修復另一個類似的 memory 泄漏,其中setdefaultkey()
不起作用。
我不會稱其為“內存泄漏”,但在第一種情況下,第一次將鍵添加到 dict 時,變量本身被dict
引用,因此如果修改values
可能會出現問題。 例如
a = dict()
key = 'newkey'
values = [1,2,3]
if key in a:
a[key].extend(values)
else:
a[key] = values
print(a[key])
values[1] = 'Ooops!'
print(a[key])
結果是
[1, 2, 3]
[1, 'Ooops!', 3]
setdefault
行為可以通過以下方式模仿:
def bogus_setdefault(d: dict, key, value):
if key in d:
return d[key]
d[key] = value
因此, a.setdefault(key,[])
檢查該鍵是否存在,如果不存在,則將其插入到具有空列表值的字典中。 這樣,當您在下一行調用a[key].extend(values)
時,您可以確定該鍵存在並且它包含一個列表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.