更新 for 循环中的迭代器 - Python

问题描述 投票:0回答:4

我偶然发现了这个难题,并且想知道 Python 是如何工作的,从而导致两组代码产生这些不同的输出。以下是 2 个 for 循环代码:

  1. 第一个案例

     l = [1,2,3]
     for i in l:
       print(i)
       l = 0
    
  2. 第二种情况

     l = [1,2,3]
     for i in l:
       print(i)
       l.append(3)
    

对于第一个场景,输出是 1, 2, 3,尽管我期望它应该返回一个错误,因为 l 将更新为 0。所以我尝试看看如果我要附加一个输出可能是什么item 到 l,它确实按照我的预期工作,即 l 确实得到更新,并无限地打印出 1,2,3,3,3,3,3,3,....。

有人可以解释为什么仅仅将 l 重新分配给某些东西不会反映在 for 循环中,但将一个项目附加到 l 确实会反映在 for 循环中吗?

谢谢!

python list loops for-loop
4个回答
0
投票

这是重新绑定变量名和改变底层对象之间的区别。

情况 1:您将名称

l
重新绑定到新值,但这不会更改当前正在迭代的列表对象。

情况 2:您实际上改变了同一个列表对象。


0
投票

当您在循环内分配值

l=0
时,您实际上是在循环内创建一个本地的新变量
l
,您可以通过打印循环内代表变量的
id
来验证这一点变量引用的内存地址:

l = [1, 2, 3]
for i in l:
    print(id(l))
    print(i)
    l = 0
    print(id(l))
1927830512328   ->id before assigning l=0
1
140728450314480 ->id after assigning l=0
140728450314480
2
140728450314480
140728450314480
3
140728450314480

0
投票

建议您打印地址值。
您可以检查从 l 到

id(l)
的地址值。

第一种情况,如果在for语句中运行l = 0并输出id(l),则显示的值与初始地址值不同。这表明for语句中现有的l和l是不同的变量。

第二种情况,地址值不变。这是因为原始地址是通过一个名为

append
的函数访问并添加了一个值。


0
投票

你找到了上帝密码,兄弟🤯❤️答案是对一切的爱

© www.soinside.com 2019 - 2024. All rights reserved.