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
是不可变的。