类方法中的默认参数不是唯一的python

时间:2017-11-20 13:18:56

标签: python class oop methods

我遇到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

然而,这对我来说并不合适。所以我的问题是,如果有更好的方法,并且有人向我解释最初的行为,因为我知道发生了什么,但我不完全理解为什么

2 个答案:

答案 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)