You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python for循环变量命名异常问题咨询(Python 3.6及以下)

为什么Python 3.6及以下修改for循环变量后会重复打印最后一个元素?

嘿,这个问题其实涉及到Python 3.6及以下版本一个容易踩坑的特性——循环变量会泄漏到外层作用域,我来给你拆解清楚:

问题根源

你之前先运行了正确的代码:

student_names = ["Mark", "Katarina", "Jessica"]
for name in student_names:
    print("Student name is {0}".format(name))

这段代码里,每次循环都会把name变量赋值为列表里的当前元素,循环结束后,name变量并不会被销毁,而是保留了最后一次赋值的结果:"Jessica"。

当你修改循环变量为i,但print语句里仍然用name时:

student_names = ["Mark", "Katarina", "Jessica"]
for i in student_names:
    print("Student name is {0}".format(name))

此时循环里的i确实在依次取列表中的元素,但你打印的是之前遗留下来的name变量——它的值已经是"Jessica"了,而且在这次循环里你根本没修改过name,所以每次print都会输出同一个值。

补充:如果是首次运行错误代码会怎样?

如果是完全新的Python会话,之前没运行过正确代码,那name变量还没被定义,运行错误代码会直接抛出NameError: name 'name' is not defined,只有当name已经存在于当前作用域中时,才会出现重复打印最后一个元素的情况。

Python版本差异

在Python 3.7及以上版本中,这个问题被修复了:for循环的变量会被限制在循环的局部作用域内,循环结束后外层无法访问到循环变量。所以在3.7+里运行你的错误代码,不管之前有没有运行过正确代码,都会直接报错NameError,不会出现重复打印的情况。

如何修复

很简单,只需要让print语句里的变量和循环变量保持一致就行:

# 用i作为循环变量时
student_names = ["Mark", "Katarina", "Jessica"]
for i in student_names:
    print("Student name is {0}".format(i))

# 或者用student作为循环变量时
student_names = ["Mark", "Katarina", "Jessica"]
for student in student_names:
    print("Student name is {0}".format(student))

内容的提问来源于stack exchange,提问作者Pink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:52:20