要在for循环中更改变量值?

时间:2020-10-06 01:23:07

标签: 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

我曾希望对循环中每个迭代结束变量的更改会留在循环之外,但显然并非如此。我认为这可能与可变范围有关?有人可以解释这是如何工作的吗?

3 个答案:

答案 0 :(得分:1)

实际上,它与范围无关。

在这里,您使用值i进行迭代,并且仅增加i值,而不增加x,y或z变量。因此,x,y和z保持不变。

要更改,请按以下方式使用:

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

答案 1 :(得分:1)

实际上,您甚至不需要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()或其他不自然的方法。

答案 2 :(得分:0)

问题是library(PRROC) x <-rnorm(1000) y <-rnorm(1000,-1) pr <- pr.curve(x,y, curve=TRUE) plot(pr) 变量就像i语句中的“临时”变量。因此,您需要在每次迭代中将for分配给数组的值。看下一个例子:

i