python - 变量值正在改变,但我不明白为什么

时间:2015-04-07 11:23:14

标签: python

我试图在磁盘上找到最低的电荷能量分布 电荷的坐标存储在阵列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

2 个答案:

答案 0 :(得分:0)

A=Q不会创建副本。它只会使AQ指向相同的项目,因此通过一个变量的突变将导致另一个变量(不完全是这样 - 它只是{{1} }和A是相同的,并且指的是相同的内存位置。)

尝试

Q

这实际上将关闭A=Q[:] ,您将能够更改一个,而不会导致其他列表发生更改。

答案 1 :(得分:0)

A=Q制作浅层副本。如果您修改A中的元素,则会在Q中修改它们。