2013-04-07 20 views
0

我有這樣的功能:的Python:我的功能改變參數無故

def change_position(old_particles): 
    inc_r=0.5 
    inc_angle=0.5 
    N=len(old_particles) 
    particlesx=old_particles 
    a=random.randint(0,N-1) 
    b=random.randint(0,1) 
    max_angle=np.pi*2 
    c=random.randint(0,1) 
    print 'old_particles before change', old_particles 
    print 'new before change', particlesx 
    if b==1: 
     if c==1: 
      particlesx[a][b]=particlesx[a][b]+inc_angle 
      if particlesx[a][b]>max_angle: 
       particlesx[a][b]=particlesx[a][b]-max_angle 
      print 'cambiamos particula',a, particlesx[a][b] 
    if b==1: 
     if c==0: 
      particlesx[a][b]=particlesx[a][b]-inc_angle 
      if particlesx[a][b]<0: 
       particlesx[a][b]=particlesx[a][b]+max_angle 
      print 'cambiamos',a, particlesx[a][b] 
    if b==0: 
     if c==0: 
      particlesx[a][b]=particlesx[a][b]+inc_r 
      if particlesx[a][b]>1: 
       particlesx[a][b]=particlesx[a][b]-inc_r 
      print 'cambiamos',a, particlesx[a][b] 
    if b==0: 
     if c==1: 
      particlesx[a][b]=particlesx[a][b]-inc_r 
      if particlesx[a][b]<0: 
       particlesx[a][b]=particlesx[a][b]+inc_r 
      print 'cambiamos',a, particlesx[a][b] 
    print'after change', particlesx 
    print'old_particles after change', old_particles 
    return particlesx, a 

問題是一個原因,我不明白,在職能轉變的「particlesx」不僅是價值,而且在old_particles的值,這樣腳本末尾的兩個數組的值不僅在函數中,而且在函數外部也是一樣的。誰能幫我這個? 謝謝!

回答

2

以下:

particlesx=old_particles 

不會使列表的副本。相反,它使particlesxold_particles指向相同的列表。當你改變一個,他們都改變。

爲了使彼此獨立的二,你需要做一個副本:

import copy 
... 
particlesx = copy.deepcopy(old_particles) 
+1

例如:如果您在類中的元素是不可變的,你可以也使用語法new_p = old_p [ :] – Ant 2013-04-07 16:13:32

+0

@Ant:在這裏,它們不是(這些元素本身就是列表)。因此我建議使用'deepcopy()'。 – NPE 2013-04-07 16:14:22

+0

是的,我知道,只是爲了清除那一點 – Ant 2013-04-08 16:42:08