我偶然发现了这个难题,并且想知道 Python 是如何工作的,从而导致两组代码产生这些不同的输出。以下是 2 个 for 循环代码:
第一个案例
l = [1,2,3]
for i in l:
print(i)
l = 0
第二种情况
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 循环中吗?
谢谢!
这是重新绑定变量名和改变底层对象之间的区别。
情况 1:您将名称
l
重新绑定到新值,但这不会更改当前正在迭代的列表对象。
情况 2:您实际上改变了同一个列表对象。
当您在循环内分配值
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
建议您打印地址值。
您可以检查从 l 到
id(l)
的地址值。
第一种情况,如果在for语句中运行l = 0并输出id(l),则显示的值与初始地址值不同。这表明for语句中现有的l和l是不同的变量。
第二种情况,地址值不变。这是因为原始地址是通过一个名为
append
的函数访问并添加了一个值。
你找到了上帝密码,兄弟🤯❤️答案是对一切的爱