python为什么对象之间会共享默认值?
这种类型的缺陷通常会惹恼新手程序员。考虑这个函数
deffoo(mydict={}):# Danger: shared reference to one dict for all calls...computesomething...
mydict[key]=value
returnmydict
第一次调用此函数时,mydict
包含一项。第二次,mydict
包含两项,因为当 foo()
开始执行时, mydict
中已经有一项了。
函数调用经常被期望为默认值创建新的对象。 但实际情况并非如此。 默认值会在函数定义时一次性地创建。 如果对象发生改变,就如本示例中的字典那样,则对函数的后续调用将会引用这个被改变的对象。
按照定义,不可变对象例如数字、字符串、元组和 None
因为不可变所以是安全的。 对可变对象例如字典、列表和类实例的改变则可能造成迷惑。
由于这一特性,在编程中应遵循的一项好习惯是不使用可变对象作为默认值。 而应使用 None
作为默认值和函数中的值,检查值为 None
的形参并创建相应的列表、字典或其他可变对象。 例如,不要这样写:
deffoo(mydict={}):...
而要这样写:
deffoo(mydict=None):ifmydictisNone:
mydict={}# create a new dict for local namespace
这一特性有时会很有用处。 当你有一个需要进行大量耗时计算的函数时,一个常见技巧是将每次调用函数的参数和结果值缓存起来,并在同样的值被再次请求时返回缓存的值。 这称为“记忆”,具体实现方式可以是这样的:
# Callers can only provide two parameters and optionally pass _cache by keyworddefexpensive(arg1,arg2,*,_cache={}):
if(arg1,arg2)in_cache:
return_cache[(arg1,arg2)]
# Calculate the value
result=...expensivecomputation...
_cache[(arg1,arg2)]=result# Store result in the cache
returnresult
你也可以使用包含一个字典的全局变量而不使用参数默认值;这完全取决于个人偏好。
以上是 python为什么对象之间会共享默认值? 的全部内容, 来源链接: utcz.com/z/520635.html