Python在while循环中更新我的变量?

时间:2019-07-19 11:39:09

标签: python-3.x

在计算norm_时,Python正在更新v0。我不明白为什么会这样,并且导致norm_为0。如果我在matlab中运行相同的代码,则该代码有效。 '''python

v = array([0, 0])
norm_ = 1
n = 0
while norm_ > tol:
    v0 = v
    v[0] = max(5.0 + 0.5 * lmbda * v[0] + 0.5 * lmbda * v[1], 10.0 + lmbda * v[1])
    v[1] = -1 + lmbda * v[1]
    norm_ = norm(v - v0, inf)
    n += 1

'''

2 个答案:

答案 0 :(得分:0)

就像在Python中一样,当您更改元素'v'时,每个变量都是一个引用,它将影响'v0',因为它指向同一对象。  我建议您使用复制来避免它:

v0 = array([0, 0])
v = copy(v0)
norm_ = 1
n = 0
while norm_ > tol:
    v[0] = max(5.0 + 0.5 * lmbda * v[0] + 0.5 * lmbda * v[1], 10.0 + lmbda * v[1])
    v[1] = -1 + lmbda * v[1]
    norm_ = norm(v - v0, np.inf)
    n += 1

答案 1 :(得分:0)

与python Numpy对象一样,

list数组对象是其他对象(dtype)的可变容器。在您的代码段中,在每次迭代中,分配v0 = v时,两个变量都指向相同的内存位置。因此,对其中之一进行变异会导致另一变异。要更改此行为,可以使用copy()属性:

import numpy as np

a = np.array([0, 0])
b_1 = a
b_2 = a.copy()
print(b_1 is a)  #  True
print(b_2 is a)  #  False

因此最终代码必须为:

v = array([0, 0])
norm_ = 1
n = 0
while norm_ > tol:
    v0 = v.copy()
    v[0] = max(5.0 + 0.5 * lmbda * v[0] + 0.5 * lmbda * v[1], 10.0 + lmbda * v[1])
    v[1] = -1 + lmbda * v[1]
    norm_ = norm(v - v0, inf)
    n += 1

旁注:要导入numpy,请使用import numpy as np作为约定。例如,它可以帮助您使用norm = np.norm(...),并使代码更易于阅读和调试。