【问题标题】:Variable confusion in a For LoopFor 循环中的变量混淆
【发布时间】:2015-09-12 16:04:26
【问题描述】:

在下面的示例中,就好像 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

我在这里错过了什么?

【问题讨论】:

  • @jonrsharpe 我想说是相关的,但是这里的 OP 还没有意识到他想要复制对象:)
  • @mescalinum 副本解释了问题和解决方案。您是否认为这从未被报道过?
  • 那么应该存在一个更好的副本
  • @mescalinum “更好” 怎么样?请注意,如果您认为可以改进它,则可以对其进行编辑,这比再次回答相同的问题更有用。

标签: python for-loop scope variable-assignment


【解决方案1】:
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]))

如果你不想要这种行为,你应该copyX。

>>> 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]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 2016-06-16
    • 1970-01-01
    • 2016-10-22
    • 2011-12-06
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多