Python 在for循环中更改变量值?
我对在Python 在for循环中更改变量值?,python,python-3.x,for-loop,scope,Python,Python 3.x,For Loop,Scope,我对在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 我本以为对循环中每个迭代变量的更改都会停留在循环之外,但显然不是这样。我想可能是
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循环
来展示你所说的问题,但实际上不是
举一个简单的例子:
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
变量就像一个“临时变量”语句的中的变量。因此,您在每次迭代中将i
赋值给数组的值。请看下一个示例:
array=[1,2,3]
对于数组中的i:
i+=10#这里我们修改“临时”变量
打印(数组)#打印1 2 3
索引=0
对于数组中的i:
数组[index]+=10#这里我们正在修改数组
指数+=1
打印(数组)#打印11 12 13
我想OP是在问为什么会这样。@AMC解释也包括在内。我认为这不是完整的情况。如果在列表列表上进行迭代,可以对列表进行变异:l=[[1]、[2]];对于l中的j:j.append(4)
将在适当位置修改l
,感谢您的详细解释!我明白你所说的没有共享引用,修改I
如何不影响x
。我不太确定它与不变性有什么关系。如果我赋值I=1
,那不是一个不变的类型吗?但是我可以在以后分配I+=10
,产生11
。实际上,当你这样做I+=10
时,它不是直接修改值,而是先复制它,然后进行计算
,最后将结果重新分配给I
。它可能看起来像这样:i=1(#初始化)temp=i(#复制)i=temp+10(#计算然后重新分配)
您理解的问题是,i
在每次迭代中引用某个对象,但随后您立即将i
更改为引用另一个有价值的对象,例如,x+10
。这与原始的x
没有联系。此外,x
是不可变的。