在for循环中更改变量值?

Changing variable values in for loop?

我对在 for 循环的一部分中修改的变量在循环外的行为感到困惑。在进行更复杂的分析时遇到了这个问题,但意识到这是一个基本的 for 循环问题,可以通过玩具示例轻松显示:

x, y, z = 1, 2, 3

for i in [x, y, z]:
    i += 10
    print(i)

# prints 11
# prints 12
# prints 13

print(x, y, z)
# prints 1 2 3

我本来希望循环中每个迭代变量的更改都停留在循环之外,但显然情况并非如此。我想这可能与可变范围有关?有人可以解释一下这是如何工作的吗?

其实跟作用域无关

此处您使用值 i 进行迭代并仅增加 i 值,而不是 x、y 或 z 变量中的任何一个。所以 x、y 和 z 保持不变。

要更改,请像这样使用:

b = {'x': 1,'y': 2, ,'z': 3}
for m in b.keys():
  b[m] += 10

实际上,您甚至不需要 for loop 来展示您所谓的问题,但实际上并非如此。

举个简单的例子:

x = 1
i = x
i += 10
print(x)
print(i)

当然 x 没有被修改,因为它拥有一个不可变的值 1

以下是 Python 中的不可变类型:

  • 所有基本类型:intfloatbool
  • 加上tuplestr

不变性 表示无共享引用。 这样当你有: x = 1 y = 1 并不意味着 xy 指的是相同的确切值 1 而是两个变量中的每一个都有相同值的“重复”实例。因此,更改 x 根本不会影响 y

同理,当你有: x = 1 i = x 这将创建一个“1 的全新值”并将其分配给 i,因此修改 i 根本不会影响变量 x

但是现在,要获得您想要的行为,您可以执行以下操作:

x, y, z = 1, 2, 3
l = [x, y, z]
for i in range(len(l)):
    l[i] += 10
x, y, z = l

或者如果你真的想变得有点古怪,你可以这样做:

x, y, z = 1, 2, 3
for var in locals().keys():
    if var in ['x', 'y', 'z']:
        locals()[var] += 10

但请记住,保持某些类型不可变是语言创建者的一个很好的设计决策,因此您应该使用它并完全避免使用 locals() 如上所述或其他不自然。

问题是 i 变量就像 for 语句中的“临时”变量。因此,您在每次迭代中将 i 分配给数组的值。看下一个例子:

array = [1, 2, 3]

for i in array:
    i += 10 #here we are modifying the "temporary" variable
    
print(array) #prints 1 2 3

index = 0
for i in array:
    array[index] += 10 #here we are modifying the array
    index += 1
    
print(array) #prints 11 12 13