对 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)
现在,我正在尝试驱动这个东西并将“星星”的各种更新存储在名为“历史记录”的列表中:
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]]
Second:
>>> 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”哲学。但对我来说,直接完成指针的重新分配,但以更复杂的方式完成“深层复制”有点背离我通常想要做的事情的方式。谁能启发我吗?再次感谢。