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

28 投票
1 回答
21327 浏览
提问于 2025-04-16 16:00

这里有一个函数。我想用关键字参数的默认值来让字典在没有提供时变成一个空字典。

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

但是当我下一次调用这个函数时,我得到了:

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

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

我可以找到解决办法,但我想请你帮我理解这个问题。我原本以为关键字参数是在函数的局部范围内的,函数返回后就会被删除。(如果我用词不准确,请原谅并纠正我。)

所以,名字为d的局部值应该被删除,而在下一次调用时,如果我没有提供关键字参数d,那么d应该被设置为default {}。但是正如你所看到的,d被设置为上一次调用时d所指向的那个字典。

这是怎么回事呢?

在定义行中的literal {}是在外部范围内吗?

这种行为在2.5、2.6和3.1版本中都能看到。

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})
>>> 

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答