我有以下简单代码:
i = 1
j = 6
test = 99
def main():
### i = 1 ### uncommenting this solves the problem with i
while i <= j:
print("i: ", i, "test: ", test)
i += 2
main()
错误:
而我<= j:UnboundLocalError:之前引用的局部变量'i' 作业
确定,因此在函数中插入定义i
的行即可解决此问题。
但是为什么变量j
和test
不受此行为影响?
这似乎对while循环的第一个变量很特殊。
答案 0 :(得分:1)
当python编译一个函数时,它会跟踪等号左侧使用的所有变量(即,分配了某些东西的所有变量)并将其用作局部变量集。引用但未分配给它们的变量显然不是局部变量,并且必须在封闭范围内。
如果要为全局变量分配值,则必须告诉python打破其局部变量规则。您可以在函数中使用global
关键字来完成此操作。它告诉python,仅对于那一个函数,命名变量是全局变量,不应编译为局部变量。
i
是个问题,而test
和j
却不是问题的原因是,i
是唯一分配给它的人。
编辑
深入研究一下,python保留了一个局部变量列表,并将这些条目称为“插槽”。编译函数时,变量名称将转换为插槽表的索引。名称查找变成简单的整数查找,从而使函数运行更快。调用该函数时,python为已知的局部变量创建一个新的插槽表,并将其初始化为“未分配”。使用变量时,python检查其插槽,查看其标记为“未分配”并引发错误。
答案 1 :(得分:0)
尝试一下:
i = 1
j = 6
test = 99
def main():
### i = 1 ### uncommenting this solves the problem with i
global i
while i <= j:
print("i: ", i, "test: ", test)
i += 2
main()