我遇到python类中的默认参数问题。似乎没有给出参数时,默认链接到类的所有实例的同一对象。例如:
class My_class:
def __init__(self,options=[]):
self.options = options
class1 = My_class()
class2 = My_class()
class2.options.append('something')
print(class1.options)
这将打印:
['something']
如何确保类的每个实例都有一个唯一的选项列表,而不是对同一个对象的引用。例如,我就是这样做的:
def __init__(self,options=None):
if options is None:
options = []
self.options = options
然而,这对我来说并不合适。所以我的问题是,如果有更好的方法,并且有人向我解释最初的行为,因为我知道发生了什么,但我不完全理解为什么
答案 0 :(得分:2)
这是最常见的python gotchas之一。
Python的默认参数 在定义函数时评估一次,而不是每次都评估 函数被调用。这意味着如果您使用可变默认值 争论并改变它,你将为所有人改变那个对象 将来调用该函数。你的第二个变种是无 很好,广泛用于python。
答案 1 :(得分:-1)
两个对象使用相同的列表引用我猜,当你指定它就像浅层复制一样,试试这个deepcopy会为这两个对象创建新的列表。
import copy
class My_class:
def __init__(self,options=[]):
self.options = copy.deepcopy(options)
class1 = My_class()
class2 = My_class()
class2.options.append('something')
print(class1.options)
print(class2.options)