为什么不同实例的字段在python模块中混合在一起?

2024-04-20 00:00:39 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument

考虑下面的python测试.py模块:

class Container:
    def __init__(self, str_list=[]):
        self.str_list = str_list

    def from_strings(self, st=""):
        self.str_list.append(st)
        return self

o1 = Container().from_strings(st="o1")
o2 = Container().from_strings(st="o2")
o3 = Container().from_strings(st="o3")

def prnt():
    print("o1's list:"+str(o1.str_list))
    print("o2's list:"+str(o2.str_list))
    print("o3's list:"+str(o3.str_list))

if __name__ == '__main__':
    prnt()

为什么python test.py的输出是:

  o1's list:['o1', 'o2', 'o3']
  o2's list:['o1', 'o2', 'o3']
  o3's list:['o1', 'o2', 'o3']

而不是:

  o1's list:['o1']
  o2's list:['o2']
  o3's list:['o3']

(我似乎不明白为什么同一个模块中不同实例的字段(str\u list)会混淆。一个指向python文档的指针来解释这个概念将非常感激)


Tags: 模块frompyselfcontainerdeflistst
1条回答
网友
1楼 · 发布于 2024-04-20 00:00:39

您在构造函数中创建了一个空列表作为默认值:

def __init__(self, str_list=[]):
    self.str_list = str_list

此列表只创建一次,然后由所有实例共享。如果您想为每个实例创建一个单独的列表,可以执行以下操作:

def __init__(self, str_list=None):
    self.str_list = [] if str_list is None else str_list

现在每个实例创建自己的列表。你知道吗

编辑:

怎么回事?你知道吗

您可能使用过1'foo'之类的默认参数,但从未遇到过问题。 它们是不可变的对象,不能操作。每当你认为你这样做,你得到一个新的实例代替。不可变对象类型的集合包括intstrtuple等等。你知道吗

现在[],一个list,是一个可变的对象,它可以操作。因此,无论何时更改其上的属性,它都会更改实际对象,对它的每个引用都会反映这些更改。你知道吗

相关问题 更多 >