当一个对象创建一个不同类的对象时,它们共享数组吗?

时间:2019-03-18 03:42:46

标签: python

当使用一个对象从另一个类创建另一个对象时,似乎作为参数传递的数组实际上在两个类之间共享。整数不会表现出这种行为。我不知道如何进一步解释它,希望代码能说明一切。这种行为是有意的吗?如果是这样,如何将数组分开?

class foo:
    def __init__(self, array, integer):
        self.list = array
        self.list[0] = self.list[0] + 1
        self.number = integer
        self.number = self.number + 1
        print('list: ' + str(self.list[0]))
        print('number: ' + str(self.number))
class bar:
    def __init__(self):
        self.objects = []
        self.defaultarray = [1]
        self.defaultnumber = 1
        for i in range(0,3):
            print('default list: ' + str(self.defaultarray))
            self.objects.append(foo(self.defaultarray, self.defaultnumber))

item = bar()   

#expected result:
#default list: [1]
#list: 2, number: 2
#default list: [1]
#list: 2, number: 2
#default list: [1]
#list: 2, number: 2

#actual result:
#default list: [1]
#list: 2, number: 2
#default list: [2]
#list: 3, number: 2
#default list: [3]
#list: 4, number: 2

1 个答案:

答案 0 :(得分:0)

我实际上并不了解这种行为,但是据我所知,Python在实例化时通过引用而不是值来传递数组。从代码示例可以看出,这意味着您将从两个对象中对数组进行变异。

如果您严格希望传递数组的副本并且不让两个对象都对其进行变异,则可以使用:

self.objects.append(foo(self.defaultarray.copy(), self.defaultnumber))

如果您熟悉C,请考虑使用Python将数组的地址传递给对象。两个对象都引用相同的地址,因此都对同一数组进行了突变。我希望这有助于减轻围绕此处实际发生情况的某些神秘感。