python相当新,python类很新。问题有一点涉及。最欣赏你的耐心:python覆盖我的列表元素
我有一个类“星级”。很简单。属性x,v和质量。另一个级别Galaxy有一个属性“星星”,它只是一个明星对象列表:
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刚刚更新的“明星”的所有元素,然后返回“明星”:
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]]
二:
>>> 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被“重新指向”一个全新的存储位置,而一个[0]继续指向旧的b。第二,b中的内存被“编辑”,一个[0]仍然指向那个位置。追加后,a [1]也指向该位置。我现在有吗?
我对python很陌生,现在还在搞清楚pythonic哲学。但对我而言,重新分配直接完成的指针,但以更复杂的方式完成的“深层复制”与我通常想要做的事情相反。任何人都可以启发我吗?再次感谢。
为什么'numstars'和'stars'类变量而不是实例变量? (并且,如果你确实有充分的理由,为什么要立即用'__init__'函数中的实例'numstars'替换类'numstars') – abarnert
没有在'Star'中看到更新函数的代码,它是我很难推荐除[[copy.deepcopy]](http://docs.python.org/2/library/copy.html#copy.deepcopy) – inspectorG4dget
以外的任何其他内容,在最后一行中出现语法错误的代码。 – MikeHunter