附加列表的Python方法不起作用?

时间:2017-01-12 14:01:11

标签: python-2.7 class

我现在正试图在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吗?

3 个答案:

答案 0 :(得分:0)

在你的第一个例子中:

foo1=foo2=foo3=Class1([])

您只创建Class1的单个实例,并为其指定三个不同的名称。无论您是在foo1foo2还是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([])中,foo1foo2foo3指的是完全相同的对象(实例),这意味着无论您对其中任何一个做什么,都完全相同对象将被修改,它只有三个名称(foo1foo2foo3)供您使用。

foo1=Class1([])
foo2=Class1([])
foo3=Class1([])

虽然在上面的代码中,foo1foo2foo3Class1的三个不同实例,但它们并不是指同一个对象。

您始终可以使用id(foo1)id(foo2)id(foo3)来确定它们是否完全相同。