我不太清楚为什么以下不起作用。我试图将一个字典对象发送到一个函数,测试一些东西,并在满足某些条件时使dict为null。我不知道为什么。
我尝试做的简单版本:
def destroy_bad_variables(a):
# test if a is a bad variable, nullify if true
#del a # doesn't work.
a = None
print a # this says its null
def change(a):
a['car'] = 9
b = {'bar':3, 'foo':8}
print b
change(b)
print "change(b):", b
destroy_bad_variables(b)
print "destroy_bad_variables(b):", b
它产生以下输出:
{'foo': 8, 'bar': 3}
change(b): {'car': 9, 'foo': 8, 'bar': 3}
None
destroy_bad_variables(b): {'car': 9, 'foo': 8, 'bar': 3}
可以通过预期的函数修改dict,但由于某种原因,它不能设置为None。为什么是这样?这种看似不一致的行为是否有充分理由?原谅我的无知,我在python上读过的书都没有解释这一点。据我所知,dicts是“可变的”,该函数应该使dict对象无效,而不是它的一些副本。
我知道我可以通过设置b = destroy(b)并从destroy()返回None来解决它,但我不明白为什么以上不起作用。
答案 0 :(得分:4)
当你说
时a = None
你正在a
引用None
,它早先指向字典对象。但是当你做的时候
a['car'] = 9
a
仍然是对字典对象的引用,因此,您实际上只是将新键car
添加到字典对象中。这就是它运作的原因。
因此,清除字典的正确方法是使用dict.clear
方法,就像这样
a.clear()
答案 1 :(得分:0)
为什么它无法正常工作:
>>> a=[1,2,3,4]
>>> def destroy(a):
... del a # here a is local to destroy only
...
>>> destroy(a)
>>> a
[1, 2, 3, 4]
答案 2 :(得分:0)
您没有销毁任何内容,只是将a
的值更改为None
本地范围内的destroy
。
为什么你不是简单地使用:
some_dictionary = None
要删除对some_dictionary
的引用?当没有人再引用some_dictionary
时,垃圾收集器将进行破坏。
在您的代码中:
b = None # replaced: destroy(b)