为什么Python中对象之间共享默认值?

为什么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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程