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
相关产品推荐
相关产品推荐

