对于本地词典中这种意外的全局行为,有何解释?

时间:2018-12-07 10:50:31

标签: python dictionary global-variables default-value local-variables

将默认值分配给函数的字典参数时,遇到了这种奇怪的,违反直觉的行为。假设我有以下代码:

def test_fn(d = dict()):
    import time
    for k, v in d.items():
        print(f'{k}\t{v}')
    d[time.ctime()] = 'AAAAAAAAAAGH'

在我最喜欢的IDE中反复运行此功能将产生以下输出:

>>> test_fn()

>>> test_fn()
Fri Dec  7 21:35:31 2018        AAAAAAAAAAGH

>>> test_fn()
Fri Dec  7 21:35:31 2018        AAAAAAAAAAGH
Fri Dec  7 21:35:32 2018        AAAAAAAAAAGH

>>> test_fn()
Fri Dec  7 21:35:31 2018        AAAAAAAAAAGH
Fri Dec  7 21:35:32 2018        AAAAAAAAAAGH
Fri Dec  7 21:35:34 2018        AAAAAAAAAAGH

>>> test_fn()
Fri Dec  7 21:35:31 2018        AAAAAAAAAAGH
Fri Dec  7 21:35:32 2018        AAAAAAAAAAGH
Fri Dec  7 21:35:34 2018        AAAAAAAAAAGH
Fri Dec  7 21:35:35 2018        AAAAAAAAAAGH

。现在,根据我的直觉,明确地d = dict()分配为默认参数应该在每次运行函数时创建dict类的新实例,当然,此变量应仅存在于本地。确实,如果我尝试在d之外访问test_fn,我当然会得到一个NameError

>>> d
Traceback (most recent call last):

File "<ipython-input-9-e983f374794d>", line 1, in <module>
d

NameError: name 'd' is not defined

但是很明显,Python在某种意义上将d视为全局对象,因为只要运行函数,它就会增长。

有人对此行为有任何解释吗?对我来说,这似乎不是Python风格的。这是故意设计的功能吗?不管是否默认将一个空的dict作为默认值,都是一种好习惯,是否有一种方法实际上可以在每次函数运行时强制Python创建一个新的?

0 个答案:

没有答案