在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 中的不可变类型:
- 所有基本类型:
int
、float
、bool
- 加上
tuple
和str
不变性 表示无共享引用。
这样当你有:
x = 1
y = 1
并不意味着 x
和 y
指的是相同的确切值 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
我对在 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 中的不可变类型:
- 所有基本类型:
int
、float
、bool
- 加上
tuple
和str
不变性 表示无共享引用。
这样当你有:
x = 1
y = 1
并不意味着 x
和 y
指的是相同的确切值 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