为什么Python中对象的默认值是共享的?
Python 中的默认值概念基于使用可变或不可变对象。良好的编程实践是不使用可变对象作为默认值。相反,使用 None 作为默认值以避免问题。不可变对象(例如数字、字符串、元组和 None)是安全的,不会发生更改。对可变对象(例如字典、列表和类实例)的更改可能会导致混淆。
让我们看看函数中字典的示例,以及相关问题以及如何解决它。
问题
我们有一个函数。其中,我们有一个带有默认值的字典作为参数。第一次调用此函数时,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 = {}
当您有一个计算时间很长的函数时,一种技术是缓存参数和每次函数调用的结果值,并在再次请求相同值时返回缓存的值。
这称为记忆化,可以这样实现:
# Callers can only provide two parameters and optionally pass _cache by keyword def expensive(arg1, arg2, *, _cache={}): if (arg1, arg2) in _cache: return _cache[(arg1, arg2)] # Calculate result = ... expensive computation ... _cache[(arg1, arg2)] = result return result
以下代码将结果存储在缓存中:
_cache[(arg1, arg2)] = result
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP