【问题标题】:Append of lists in Python在 Python 中追加列表
【发布时间】:2014-05-09 17:19:42
【问题描述】:

python 中一个奇怪的列表追加。

我在这里定义了一个类

class test:
    group = []
    def __init__(self,name):
    self.name = str(name)

然后我写那些

test0 = test(0)
test1 = test(1)
test_list = [test0, test1]

我想将test1.name 保存到test0.group

test_list[0].group.append(test_list[1].name)

我打印 test0.group ,它是 ['1'] ,一切正常。 但是虽然我想将 test0.name 保存到 test1.group

test_list[1].group.append(test_list[0].name)

然后我打印test1.group,它是['1','0']。不知道为什么不是['0']? 对了,这里我打印的是test0.group,也是['1','0']

【问题讨论】:

    标签: list python-2.7 append


    【解决方案1】:

    这是因为group 变量是类test 的所有实例共享的变量,因此test0test1 共享同一个组。当您执行第一个附加时,即'1' 很好,但是当您执行第二个附加时,您将附加到同一个列表,因此它变为['1', '0']。事实上,如果你打印test0.group 作为代码的最后一行,你会看到它也是['1', '0'],因为它们是同一个变量。我不确定您要达到什么目的,但是如果您想要单独的组,那么您应该将它们设为 self.group 并将它们移动到 __init__ 方法中。如果您可以改写您的问题,我也许可以帮助您解决您实际上想要实现的目标。

    【讨论】:

    • 您的回答简短但非常有用。我已经解决了~
    【解决方案2】:

    我认为问题出在类定义中:

    class test:
        group = []
        def __init__(self,name):
        self.name = str(name)
    

    此时,__init__ 方法什么也不做,self.name = str(name) 永远不会被调用。您需要缩进 self.name = str(name) 以使其位于 __init__ 的正文中。试试这个:

    class test:
        group = []
        def __init__(self,name):
            self.name = str(name)
    

    【讨论】:

    • 无论如何,谢谢,缩进错误是我编辑问题时的错误。
    【解决方案3】:

    这与here中讨论的问题基本相同。

    令人惊讶吗?当您定义类时,Python 解释器执行类字段。然后,如果您创建类的新实例,则不会执行类字段。因此类字段仅在您定义类时执行一次。喜欢:

    class someClass:
        someVar = 0        #<---This class field is executed once
        def __init__(self):
            pass
    

    好的。现在你定义了类。接下来,您创建该类的新实例。喜欢:

    instance1 = someClass()
    instance2 = someClass()
    

    这将创建新内存并从someClass 复制数据。 现在instance1instance2 不共享内存空间。他们有自己独立的内存空间。所以instance1.someVarinstance2.someVar 有不同的内存空间。但是instance1.someVar 中的0instance2.someVar 中的0 是完全相同的对象(0 在相同的内存空间上)。你可以确保它这样做:

    print id(instance1.someVar)==id(instance2.someVar)
    

    所以你可以发现0 是完全一样的对象。

    someClass.someVar = 0 不是唯一的情况。当您使用 [] 替换 0 时,也会发生同样的事情。


    回到您的代码。您可以像这样简单地出现问题:

    class test:
        group = []
        def __init__(self,name):
            self.name = str(name)
    
    test0 = test(0)
    test1 = test(1)
    
    test0.group.append(100)
    
    print test0.group
    print test1.group
    #[100]
    #[100]
    #will be printed
    

    这是因为test0.grouptest1.group 指向同一个对象。喜欢:

    +-----------+
    |test0.group|------+
    +-----------+      |
                       v
                   +-------+
                   |  []   |
                   +-------+
                       ^
    +-----------+      |
    |test1.group|------+
    +-----------+
    

    当你执行test0.group.append(100)时,它变成了:

    +-----------+
    |test0.group|------+
    +-----------+      |
                       v
                   +-------+
                   | [100] |
                   +-------+
                       ^
    +-----------+      |
    |test1.group|------+
    +-----------+
    

    您也可以设置另一个对象。喜欢:

    test1.group = "123"
    

    然后test1.group 变成:

    +-----------+
    |test0.group|------+
    +-----------+      |
                       v
                   +-------+
                   | [100] |
                   +-------+
    
    +-----------+       +-----+
    |test1.group|------>|"123"|
    +-----------+       +-----+
    

    对不起,我的英语不好。我希望它有所帮助。 :)

    【讨论】:

    • 非常感谢您为您的患者带来新手。 ^_^
    猜你喜欢
    • 2012-08-30
    • 2021-01-09
    • 1970-01-01
    • 2023-03-09
    • 2013-11-08
    • 2021-08-22
    • 2021-08-14
    • 2017-07-17
    相关资源
    最近更新 更多