use*_*510 5 python dictionary ref
我正在处理大型嵌套词典,并试图删除嵌套的子词典。我想知道为什么会发生以下行为。
当我设置对字典 d 的引用(称为 ref),然后更改 ref 并打印 d 时,它会显示添加了第三个元素的 d 的更新版本。
input:
d={"a":1,"b":2}
ref=d
ref["c"]=3
print(d)
output:
{'a': 1, 'b': 2, 'c': 3}
Run Code Online (Sandbox Code Playgroud)
鉴于这种行为,我希望能够通过 delete 删除字典
input:
d={"a":1,"b":2}
ref=d
del ref
print(d)
output:
{'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
我想知道删除引用时是否有删除原始对象的方法(意味着第二个程序的输出将是错误的,因为d被删除了。
del实际上并不处理任何内存的取消分配,它只是从 name 中解除值的绑定,然后将该对象的引用计数减一。没有办法系统地解除给定单个引用的对象的所有名称的绑定。
直到引用计数降至 0 后的某个时刻,对象才会被垃圾回收。您可以使用该sys.getrefcount方法查看对象的引用计数(由于方法本身内的临时引用,该引用计数通常比实际值高 1)。
我们可以del在实践中使用此方法和该__del__方法(仅当对象的引用计数递减至 0 时调用该方法)进行演示:
>>> # print something when refcount == 0 and object is about to be collected
>>> class Deleted:
... def __del__(self):
... print("actually deleted")
...
>>> a = Deleted()
>>> # just a
>>> sys.getrefcount(a) - 1
1
>>> b = a
>>> # a and b
>>> sys.getrefcount(a) - 1
2
>>> del a
>>> # now it's just b
>>> sys.getrefcount(b) - 1
1
>>> del b
actually deleted
Run Code Online (Sandbox Code Playgroud)
如果您想了解更多有关所有这些内部工作原理的信息,请查看有关引用计数的内部调用的CAPI文档,并查看gcmodule,它是用于内省垃圾收集子系统的高级 python 接口。
鉴于您的具体问题,由于您正在使用可变类型的字典,因此您可以只使用clear字典:
>>> a = {"a": 1}
>>> b = a
>>> # will clear the dict that both a and b are referencing
>>> b.clear()
>>> a
{}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用等效range语法来清除字典del a[:]。
| 归档时间: |
|
| 查看次数: |
1253 次 |
| 最近记录: |