Python函数中关键字参数的默认值为空字典:似乎在后续调用中字典未初始化为{}?

28

以下是一个函数。我的意图是使用关键字参数默认值,如果没有提供字典,则将其设置为空字典。

>>> def f( i, d={}, x=3 ) :
...     d[i] = i*i
...     x += i
...     return x, d
... 
>>> f( 2 )
(5, {2: 4})

但是当我下一次调用f时,会出现以下情况:

>>> f(3)
(6, {2: 4, 3: 9})

看起来第二次调用时的关键字参数d并不指向一个空字典,而是指向上一次调用结束时的字典。每次调用时,数字x都重置为3。

现在我可以解决这个问题,但希望您能帮忙理解。我认为关键字参数应该在函数的本地作用域中,并且在函数返回后将被删除。(如果我说得不准确,请原谅并纠正我的术语。)

因此,名称d指向的本地值应该被删除,下一次调用时,如果不提供关键字参数d,则d应该设置为默认 {}。但是,如您所见,d被设置为上一次调用中d所指向的字典。

这是怎么回事?

def行中的字面{} 在封闭作用域中吗?

这种行为在2.5、2.6和3.1中都有发生。


4
这是一个典型的 Python 陷阱:函数/方法参数使用可变对象作为默认值 - Ocaso Protal
1个回答

5
>>> def f(i, d=None, x=3):
...     if not d:
...         d={}
...     d[i] = i*i
...     x += i
...     return x,d
... 
>>> f(2)
(5, {2: 4})
>>> f(3)
(6, {3: 9})
>>> 

1
我们可以将其定义为 d = d or {}。 - Program Questions
1
如果d是一个空字典,则此操作可能不会执行您想要的操作。 - Stuart Axon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接