对 python 来说相当新,对 python 类来说非常新。问题有点牵涉。非常感谢您的耐心:
我有一个班级“明星”。很简单。属性 x、v 和质量。另一个类 Galaxy 有一个属性“stars”,它只是一个星体列表:
class Galaxy:
numstars=0.
stars=[]
def __init__(self,numin,xes,vees,masses):
self.numstars=numin
for n in range(numin):
self.stars.append(Star(xes[n],vees[n],masses[n]))
Galaxy 还有一个名为 time_stepper 的属性函数。只需说 time_stepper 只是更新“stars”的所有元素,然后返回“stars”:
def time_stepper(self,dt):
self.velstep(dt)
self.xstep(dt)
self.velstep(dt)
return(self.stars)
现在,我正在尝试驱动这个东西并将“stars”的各种更新存储在一个名为“history”的列表中:
gal=Galaxy(#stuff#)
history=[]
for n in range(100):
history.append(gal.time_stepper(.1))
最后,我的问题:在这个循环的每次迭代中,“星”的新元素被添加到“历史”中,但是......在这里......历史的所有先前元素都被覆盖并给出与历史的最新元素相同的价值观! 那么发生了什么?我遇到了一些我以前不理解的关于 python 列表的事情,但我想我终于把它搞定了。显然不是。谢谢你的帮助。
附录:感谢大家的帮助。没想到会有这么多有用的回复,尤其是这么快。我的问题是我假设这两段代码本质上是相同的。第一的:
>>> a=[]
>>> b=[1,2,3]
>>> a.append(b)
>>> b=[4,5,6]
>>> a.append(b)
>>> a
[[1, 2, 3], [4, 5, 6]]
第二:
>>> a=[]
>>> b=[1,2,3]
>>> a.append(b)
>>> b[:]=(4,5,6)
>>> b
[4, 5, 6]
>>> a.append(b)
>>> a
[[4, 5, 6], [4, 5, 6]]
哎呀!他们不是。所以在代码 1 中,我猜,b 被“重新指向”到一个全新的内存位置,而 a[0] 继续指向旧的 b。在第二个中,b 处的内存被“编辑”并且 a[0] 仍然指向该位置。追加后, a[1] 也指向该位置。我现在有吗?
我对 python 很陌生,并且仍在研究“pythonic”哲学。但对我来说,直接重新分配指针,但以更复杂的方式完成“深拷贝”与我通常想要做的事情的方式有点倒退。任何人都可以启发我吗?再次感谢。