我有一个名为general
的类,它的属性是数组msgs[]
。还有一个名为msg
的属性,它是一个字符串。我实例化了三个类gen0, gen1, gen2
,并将每个对象存储在一个名为arr (arr = [gen0, gen1, gen2])
的数组中
我在类general
上定义了一个名为snd(self, id, somemsg)
的方法,该方法给定id(指向数组arr
中索引id
处的对象),将字符串somemsg
附加到数组msgs[]
。
例如,gen0.snd(1,"hello")
将执行gen1.msgs.append("hello")
def snd(self, dst, msg):
listGens[dst].msgs.append(msg)
我定义了以下函数,其中general
是上面定义的类的实例化
def playGeneral(general):
for val in listGens:
if(val.id is general.id):
general.snd(general.id, " ")
continue
general.snd(val.id, general.oc)
调用playGeneral(gen0)
时,somemsg
变量被设置为genX.msg = "A"
,即gen0.msg
,恰好是“A”;这样做,我们得到
playGeneral(listGens[0])
for val in listGens:
print(val.msgs)
[' ', 'A', 'A']
[' ', 'A', 'A']
[' ', 'A', 'A']
我不明白为什么会这样。它应该屈服了
[' ']
['A']
['A']
心灵调试:您的
general
类定义如下:或:
前者使
msgs
成为类属性,而不是实例属性,因此它在类及其所有实例之间共享,而后者则与使用默认值的所有实例共享一个list
。两种方法的解决方案是相同的:分别使用一个唯一的list
:第三种可能是您做了一些愚蠢的事情,比如
msgs = []
、gen0 = general(msgs)
、gen1 = general(msgs)
等等,或者gen0 = gen1 = gen2 = general([])
、或者listgens = [general()] * 3
等等,所有这些都归结为同一个问题:您要多次存储对同一数据的单个引用,并且需要有不同的值相关问题 更多 >
编程相关推荐