在python中的函数内部空字典

时间:2014-12-14 14:52:16

标签: python dictionary

我不太清楚为什么以下不起作用。我试图将一个字典对象发送到一个函数,测试一些东西,并在满足某些条件时使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来解决它,但我不明白为什么以上不起作用。

3 个答案:

答案 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)