将默认值分配给函数的字典参数时,遇到了这种奇怪的,违反直觉的行为。假设我有以下代码:
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创建一个新的?