我对在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
我曾希望对循环中每个迭代结束变量的更改会留在循环之外,但显然并非如此。我认为这可能与可变范围有关?有人可以解释这是如何工作的吗?
答案 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中的不可变类型:
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()
或其他不自然的方法。
答案 2 :(得分:0)
问题是library(PRROC)
x <-rnorm(1000)
y <-rnorm(1000,-1)
pr <- pr.curve(x,y, curve=TRUE)
plot(pr)
变量就像i
语句中的“临时”变量。因此,您需要在每次迭代中将for
分配给数组的值。看下一个例子:
i