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

And*_*kov 26 python dictionary scope keyword-argument

这是一个功能.我的意图是使用关键字参数默认值使字典成为空字典(如果未提供).

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

但是当我接下来打电话给f时,我得到:

>>> f(3)
(6, {2: 4, 3: 9})
Run Code Online (Sandbox Code Playgroud)

看起来第二次调用时的关键字参数d不指向空字典,而是指向前一次调用结束时留下的字典.每次通话时,号码x重置为3.

现在我可以解决这个问题,但我希望你的帮助能够理解这一点.我相信关键字参数在函数的本地范围内,并且一旦函数返回就会被删除.(如果我不精确,请原谅并纠正我的术语.)

因此,应删除名称d指向的本地值,并在下一次调用时,如果我不提供关键字参数d,则应将d设置为default {}.但正如您所看到的,d被设置为前一个调用中指向的字典.

到底是怎么回事?

literal {}在封闭范围的防线?

在2.5,2.6和3.1中可以看到此行为.

DTi*_*ing 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})
>>> 
Run Code Online (Sandbox Code Playgroud)