我真的坚持为什么下面的代码块1导致输出1而不是输出2?
代码块1:
class FruitContainer:
def __init__(self,arr=[]):
self.array = arr
def addTo(self,something):
self.array.append(something)
def __str__(self):
ret = "["
for item in self.array:
ret = "%s%s," % (ret,item)
return "%s]" % ret
arrayOfFruit = ['apple','banana','pear']
arrayOfFruitContainers = []
while len(arrayOfFruit) > 0:
tempFruit = arrayOfFruit.pop(0)
tempB = FruitContainer()
tempB.addTo(tempFruit)
arrayOfFruitContainers.append(tempB)
for container in arrayOfFruitContainers:
print container
**Output 1 (actual):**
[apple,banana,pear,]
[apple,]
**Output 2 (desired):**
[apple,]
[banana,]
[pear,]
此代码的目标是迭代数组并将每个数据包装在父对象中.这是我的实际代码的减少,它将所有苹果添加到一袋苹果等等.我的猜测是,出于某种原因,它要么使用相同的对象,要么就像水果容器使用静态数组一样.我不知道如何解决这个问题.
解决方法
您的代码有一个默认参数来初始化类.默认参数的值在编译时计算一次,因此每个实例都使用相同的列表进行初始化.像这样改变它:
def __init__(self,arr=None):
if arr is None:
self.array = []
else:
self.array = arr
我在这里更充分地讨论了这个问题:How to define a class in Python