在Python中附加列表

时间:2014-03-30 11:31:12

标签: list python-2.7 append

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']

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为问题出在班级定义中:

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)

答案 2 :(得分:0)

这与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具有不同的内存空间。但0中的instance1.someVar0中的instance2.someVar是完全相同的对象(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"|
+-----------+       +-----+

抱歉我的英语不好。我希望它有所帮助。 :)