For循环中的可变混淆

时间:2015-06-25 20:59:06

标签: python for-loop scope variable-assignment

在下面的示例中,就好像Python不区分angle[u][v]radius[u][v]

也就是说,从for循环中的第一个命令开始,评估angle数组的元素。然后,从for循环中的第二个命令,评估radius数组的相应元素。我的问题是,radius[v][u]的此值会被覆盖到angle[v][u]

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
import numpy as np
from pylab import *
import matplotlib as mpl
import math

X = np.arange(0, 656, 1)
Y = np.arange(0, 667, 1)
X, Y = np.meshgrid(X, Y)
X = X - 243 + 0.0
Y = Y - 363 + 0.0

angle = X
radius = X

height = X.shape[0]
width = X.shape[1]

print width
print height

for v in xrange(height):
    for u in xrange(width):
        angle[v][u] = math.atan2(X[v][u],Y[v][u])
        radius[v][u] = math.sqrt(X[v][u]**2 + Y[v][u]**2)
print angle
print radius

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

angle = X
radius = X

angleradius是对同一对象X的引用。 当你改变一个时,你正在改变X,反之亦然。

使用XY

查看此示例
>>> X = np.arange(0,2)
>>> Y = X
>>> X, Y
(array([0, 1]), array([0, 1]))
>>> X[0] = 5
>>> X, Y
(array([5, 1]), array([5, 1]))

如果您不想要此行为,则应copy X.

>>> from copy import copy
>>> X = np.arange(0,2)
>>> Y = copy(X)
>>> X, Y
(array([0, 1]), array([0, 1]))
>>> X[0] = 5
>>> X, Y
(array([5, 1]), array([0, 1]))