当使用一个对象从另一个类创建另一个对象时,似乎作为参数传递的数组实际上在两个类之间共享。整数不会表现出这种行为。我不知道如何进一步解释它,希望代码能说明一切。这种行为是有意的吗?如果是这样,如何将数组分开?
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
答案 0 :(得分:0)
我实际上并不了解这种行为,但是据我所知,Python在实例化时通过引用而不是值来传递数组。从代码示例可以看出,这意味着您将从两个对象中对数组进行变异。
如果您严格希望传递数组的副本并且不让两个对象都对其进行变异,则可以使用:
self.objects.append(foo(self.defaultarray.copy(), self.defaultnumber))
如果您熟悉C,请考虑使用Python将数组的地址传递给对象。两个对象都引用相同的地址,因此都对同一数组进行了突变。我希望这有助于减轻围绕此处实际发生情况的某些神秘感。