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 应该设置为default {}. 但正如您所看到的,d 被设置为 d 在前面的调用中指向的字典。

到底是怎么回事?

是否literal {}在封闭范围内的 def 行中?

这种行为在 2.5、2.6 和 3.1 中可见。

4

1 回答 1

4
>>> 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})
>>> 
于 2011-04-19T07:27:36.143 回答