为什么Python中对象之间共享默认值?
Python中的默认值概念基于使用可变或不可变的对象。良好的编程习惯是不要使用可变对象作为默认值。相反,使用None作为默认值以避免问题。不可变对象,如数字、字符串、元组和None,是安全的,不会改变。对可变对象,如字典、列表和类实例的更改可能会导致混淆。
让我们看看函数中字典的示例,以及它的问题以及如何解决。
阅读更多:Python 教程
问题
我们有一个函数。在函数中,我们有一个字典作为参数,并设置默认值。第一次调用此函数时,mydict包含一个项。第二次,mydict包含两个项目,因为在foo()开始执行时,mydict已经有一个项。
def foo(mydict={}):
... calculate...
mydict[key] = value
return mydict
我们通常希望函数调用会为默认值创建新对象。然而,这不是事实。默认值在定义函数时只被创建一次。如果更改了该对象,例如上面示例中的字典,则对函数的后续调用将引用此更改的对象。
解决方案
为了解决使用默认值作为空对象的问题,例如这样−
def foo(mydict={}):
...
使用不可变的对象像None−
def foo(mydict=None):
if mydict is None:
mydict = {}
当您有一个计算成本高的函数时,可以使用缓存每次调用函数的参数和结果值,并在再次请求相同值的情况下返回缓存的值的技术
这被称为记忆化,并可以如下实现−
# 调用者只能提供两个参数,并可通过关键字传递_cache
def expensive(arg1, arg2, *, _cache={}):
if (arg1, arg2) in _cache:
return _cache[(arg1, arg2)]
# Calculate
result = ... 繁琐的计算 ...
_cache[(arg1, arg2)] = result
return结果存储在缓存中−
```python
_cache[(arg1, arg2)] = result
极客教程