循环上的python引用和迭代器

2024-07-04 05:23:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我会在涉及的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,不是吗? 有人能解释一下吗


Tags: in脚本idforreturndef地方bug
1条回答
网友
1楼 · 发布于 2024-07-04 05:23:40

对于第一个循环,打印x, a, b的idx-是一个局部变量,不是ab。尽管它持有对相同数字的引用,但它与ab的引用实例不同。整数在python中是不可变的。当您执行类似x = x + 1的操作时,您所做的不是通过引用更改值,而是更改引用以指向新值

另外,请记住,在python中,从-5到255的整数甚至在被引用之前就已经计算出来了。这是python众多优化之一

因此,在第一次迭代中x持有一个值a,实际上1,它已经被计算出来,并且它们指向内存中的相同位置。在第二次迭代中x指向与b相同的值。但在这两种情况下,引用本身都不相同

如果你的a, b, c像列表或命令一样是可变的,你会观察到不同的行为。也许,就是你所期待的

相关问题 更多 >

    热门问题