我会在涉及的python脚本上运行一个微妙的bug。基本上出问题的地方是这样的
def inc(x):
return x+1
a = 1
b = 2
c = 3
for x in [a,b]:
print(id(x), id(a), id(b))
for x in [a,b]:
x = inc(x)
c = inc(c)
print(a,b,c)
正如第一个for循环所示,迭代器x正在引用正在进行的变量。当我们给迭代器赋值时,pointee(referencee)变量并没有改变。我真的没想到会有这种行为,这不是python,不是吗? 有人能解释一下吗
对于第一个循环,打印
x, a, b
的idx
-是一个局部变量,不是a
或b
。尽管它持有对相同数字的引用,但它与a
或b
的引用实例不同。整数在python中是不可变的。当您执行类似x = x + 1
的操作时,您所做的不是通过引用更改值,而是更改引用以指向新值另外,请记住,在python中,从-5到255的整数甚至在被引用之前就已经计算出来了。这是python众多优化之一
因此,在第一次迭代中
x
持有一个值a
,实际上1
,它已经被计算出来,并且它们指向内存中的相同位置。在第二次迭代中x
指向与b
相同的值。但在这两种情况下,引用本身都不相同如果你的
a, b, c
像列表或命令一样是可变的,你会观察到不同的行为。也许,就是你所期待的相关问题 更多 >
编程相关推荐