需要提到的是,只有当函数本身改变thisdict
时,作为参数的空才是问题。如果只是读取,则不会出现任何问题。dict
dict
如果dict
预期发生变化,为什么将空dict
作为默认参数有意义?由于调用者没有提供 this,因此他们没有对此的引用,并且对 的更改dict
在调用后丢失。
这可能有意义的唯一情况是当函数需要做一些需要更改其输入版本的事情时。在这种情况下,该函数可能应该在不直接更改输入的情况下创建更改后的版本,例如:
# bad way:
def f(x={}):
x['newkey'] = 'newvalue'
print(x) # do something with the extended x
# probably better way:
def f(x={}):
new_dict = {}
new_dict.update(x)
new_dict.update({ 'newkey': 'newvalue' })
print(new_dict) # do something with the extended x
这样(后一种方式)原件x
永远不会改变,所以不会出现问题。
我知道可变默认参数问题是众所周知的并且被认为是一个问题。但我也有一种感觉,遇到它只是它出现的代码结构存在更严重问题的症状,我想在这篇文章中指出这一点。或者换一种说法:在一段结构合理的代码中,可变的默认参数永远不会导致实际问题。