我试图在磁盘上找到最低的电荷能量分布 电荷的坐标存储在阵列Q中,将其克隆到阵列A中然后移动一个电荷。如果移动降低了能量,则接受该移动并且使用新位置将A复制到A上
我在这两行之前和之后打印Q:
if Rnew<R:
A[charge]=(Rnew, thetanew)
其中Rnew,R thetanew和charge都是数字(费用是正在改变的费用)
为什么Q会改变?
上下文的整个代码
import numpy as np
import random
from random import randint
from math import pi, cos, sin, atan2, exp
import matplotlib.pyplot as plt
N=6
R=1
W=0
Q=[] #current charge location
A=[] #potential carge location
array=np.zeros((N,N))
for i in range(0,N): #generates N charges randomly distributed in Q
Q.append((random.uniform(0,R),random.uniform(0,2*pi)))
A=Q #creates duplicate
for i in range(0,N): #Computes the initial energy, glob W
for j in range(0,N):
if i!=j:
we=0.5*(1/((Q[i][0]**2)+(Q[j][0]**2)-(2*Q[i][0]*Q[j][0]*cos(Q[j][1]-Q[i][1])))**0.5)
W=W+we
else:
break
print W
W=0
we=0
print W
deltaR=0.1
deltatheta=random.uniform(0,2*pi)
charge=randint(0,N-1)
R1=Q[charge][0]
theta1=Q[charge][1]
Rnew=((R1*cos(theta1)+deltaR*cos(deltatheta))**2 + (R1*sin(theta1)+deltaR*sin(deltatheta))**2)**0.5
thetanew=atan2((R1*sin(theta1)+deltaR*sin(deltatheta)), (R1*cos(theta1))+deltaR*cos(deltatheta))
print Q
if Rnew<R:
A[charge]=(Rnew, thetanew)
print Q
for i in range(0,N): #Computes the initial energy, glob W
for j in range(0,N):
if i!=j:
we=0.5*(1/((Q[i][0]**2)+(Q[j][0]**2)-(2*Q[i][0]*Q[j][0]*cos(Q[j][1]-Q[i][1])))**0.5)
W=W+we
else:
break
print W
答案 0 :(得分:0)
A=Q
不会创建副本。它只会使A
和Q
指向相同的项目,因此通过一个变量的突变将导致另一个变量(不完全是这样 - 它只是{{1} }和A
是相同的,并且指的是相同的内存位置。)
尝试
Q
这实际上将关闭A=Q[:]
,您将能够更改一个,而不会导致其他列表发生更改。
答案 1 :(得分:0)
A=Q
制作浅层副本。如果您修改A
中的元素,则会在Q
中修改它们。