我现在正试图在Python中使用类。我已经从班级中创建了对象:
class Class1():
def __init__(self, bar):
self.b = bar
def assignbar(self, somelist):
self.b.extend(somelist)
foo1=foo2=foo3=Class1([])
此时,打印foo1.b,foo2.b和foo3.b确实会给出空列表。 现在,我有一个单独的列表,比如15个元素长。以下是我遇到问题的地方:
numbers=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
foo1.assignbar(numbers[0:5])
foo2.assignbar(numbers[5:10])
foo3.assignbar(numbers[10:15])
print foo1.b
print foo2.b
print foo3.b
不是给我[0,1,2,3,4],[5,6,7,8,9]和[10,11,12,13,14],而是给了我全部数字三次。但是,当我像这样分别定义foo1,foo2和foo3时:
foo1=Class1([])
foo2=Class1([])
foo3=Class1([])
该程序按我认为应该运行。我想知道,为什么将所有3个对象设置为同样的东西并不起作用。是因为当你在其中任何一个上调用assignbar时,它会调用其他所有三个上的assignbar吗?
答案 0 :(得分:0)
在你的第一个例子中:
foo1=foo2=foo3=Class1([])
您只创建Class1
的单个实例,并为其指定三个不同的名称。无论您是在foo1
,foo2
还是foo3
上执行某个方法,它都会在同一个实例上执行操作。请注意,您将从以下结果中获得相同的结果:
foo3 = Class1([])
foo2 = foo3
foo1 = foo3
您的第二个示例正确地将该类实例化三次,因此可以按预期工作。
请注意,这不是特定于用户定义的类,而是针对任何可变对象:
>>> foo1 = foo2 = foo3 = []
>>> foo1.append(1)
>>> foo1
[1]
>>> foo2
[1]
>>> foo3
[1]
答案 1 :(得分:0)
我认为问题是因为你在同一个实例中工作。对象foo1获取列表[0,1,2,3,4]的时间和所有其他对象获得相同的值。在对象foo2 [5,6,7,8,9]之后,所有对象都获得相同的值。我觉得应该是问题。
答案 2 :(得分:0)
在foo1=foo2=foo3=Class1([])
中,foo1
,foo2
和foo3
指的是完全相同的对象(实例),这意味着无论您对其中任何一个做什么,都完全相同对象将被修改,它只有三个名称(foo1
,foo2
,foo3
)供您使用。
foo1=Class1([])
foo2=Class1([])
foo3=Class1([])
虽然在上面的代码中,foo1
,foo2
和foo3
是Class1
的三个不同实例,但它们并不是指同一个对象。
您始终可以使用id(foo1)
,id(foo2)
或id(foo3)
来确定它们是否完全相同。