python-2.7 - python 类函数更改列表( 参数)

  显示原文与译文双语对照的内容

我正在编写粒子群算法,这里有一个最佳全局位置的列表。 我创建的类中的函数正在改变主函数中的参数( 这里列表),所以它只是在破坏我的结果。 我不清楚发生了什么。

为了计算新的位置,我必须把best_particle_vector作为一个参数,以便计算新位置,只改变群( 它自己)

谢谢。


class Particle():


 def __init__(self):


 self.position, self.velocity = initialize_pos_vel(n_dimension)


 self.best_position = self.position


 self.best_fitness = wish_function(self.best_position)



class Swarm(): #each swarm is a vector of particles


 def __init__(self):


 self.particles = initialize_swarm(n_particles)



 def next_pos_vel(self, best_particle_vector): # calcula as novas posições e velocidade do enxame


 for i in range(n_particles):


 for j in range(n_dimension):



 temp_pos = 0


 temp_vel = 0



 temp_vel += w*self.particles[i].velocity[j] #inertia


 temp_vel += c1*random.random()*(self.particles[i].best_position[j] - self.particles[i].position[j]) #personal


 temp_vel += c2*random.random()*(best_particle_vector[j] - self.particles[i].position[j]) #social



 temp_pos = self.particles[i].position[j] + temp_vel



 if (temp_pos> MAX_position) or (temp_pos <MIN_posion): #max position limit.


 self.particles[i].position, self.particles[i].velocity = initialize_pos_vel(n_dimension) #novas posicoes e velocidades



 break



 else:


 self.particles[i].position[j] = temp_pos #nova posicao


 self.particles[i].velocity[j] = temp_vel #nova velocidade



 return self



def main():



 swarm = Swarm()


 best_global_particle_vector = swarm.particles[0].best_position #just initialization 



 while k <K+1:



 print" < <<1>> >", best_global_particle_vector," < <<1>> >"


 swarm = swarm.next_pos_vel(best_gloval_particle_vector) #new positions <<<<<<------ problemaaaaaaaaaaaaaaa


 print" < <<2>> >", best_global_particle_vector," < <<2>> >"



 '''.. . ''' 



实际结果:


< <<1>> > [-56.362471020090446, 48.27571332531588] < <<1>> >


< <<2>> > [-52.75857277952958, 41.70638206522979] < <<2>> >



它不应该改变列表 best_particle_vector 。 应当:


< <<1>> > [-56.362471020090446, 48.27571332531588] < <<1>> >


< <<2>> > [-56.362471020090446, 48.27571332531588] < <<2>> >



时间:

线条


best_global_particle_vector = swarm.particles[0].best_position #just initialization



best_global_particle_vectorparticles[0].best_position ( 在这种方法中,哪一种方法) 中的结果相同。 如果你想让它们不同,你可以复制 particles[0].best_position

确保你了解引用在 python 中的工作方式。 当你执行 self.best_position = self.position 时,将两个名称指向同一个对象,因这里改变它的他( 这里有许多教程和 q& ) 将改变它的他。

简短回答,尝试:


self.best_position = list(self.position) #same values, but two different lists



idem:


 best_global_particle_vector = list(swarm.particles[0].best_position)



( 等等,当你想将一个列表的值复制到新列表时)

你的代码本身无法工作,所以我无法检查它。

但是,如果输入的列表被修改,则可能需要对它的进行深层复制,并将副本作为参数传递。

下面是我想你要做的( 这是 python 3示例):


def list_ruiner(the_list):


 for i in range(0,len(the_list)):


 the_list[i] += the_list[i] + 1


 return the_list



vulnerable_list = [1,2,3]



# List before:


print(vulnerable_list)



# List data gets ruined by reference


print(list_ruiner(vulnerable_list))



# Original reference is ruined


print(vulnerable_list)



解决方法:


import copy



def list_ruiner(the_list):


 for i in range(0,len(the_list)):


 the_list[i] += the_list[i] + 1


 return the_list



vulnerable_list = [1,2,3]


throwaway_copy = copy.deepcopy(vulnerable_list)



# List before:


print(vulnerable_list)



# Send copy to the function:


print(list_ruiner(throwaway_copy))



# Original list stays the same


print(vulnerable_list)



...