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

2024-04-26 17:36:25 发布

您现在位置: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

Tags: 对象selfdefaultnumberfooinitdefbar
1条回答
网友
1楼 · 发布于 2024-04-26 17:36:25

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

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

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

如果您熟悉C,可以考虑Python将数组的地址传递给对象。这两个对象引用相同的地址,因此都对相同的数组进行变异。我希望这有助于减轻一些关于这里到底发生了什么的神秘感

相关问题 更多 >