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']
。
答案 0 :(得分:0)
这是因为group
变量是类test
的所有实例共享的变量,因此test0
和test1
共享同一个组。当您执行第一个追加即'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
创建新内存和复制数据。
现在instance1
和instance2
不共享内存空间。他们有自己独立的记忆空间。因此instance1.someVar
和instance2.someVar
具有不同的内存空间。但0
中的instance1.someVar
和0
中的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.group
和test1.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"|
+-----------+ +-----+
抱歉我的英语不好。我希望它有所帮助。 :)