为什么不能在函数内部使用全局变量?

时间:2020-02-27 08:32:16

标签: python variables while-loop

我有以下简单代码:

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的行即可解决此问题。

但是为什么变量jtest不受此行为影响?
这似乎对while循环的第一个变量很特殊。

2 个答案:

答案 0 :(得分:1)

当python编译一个函数时,它会跟踪等号左侧使用的所有变量(即,分配了某些东西的所有变量)并将其用作局部变量集。引用但未分配给它们的变量显然不是局部变量,并且必须在封闭范围内。

如果要为全局变量分配值,则必须告诉python打破其局部变量规则。您可以在函数中使用global关键字来完成此操作。它告诉python,仅对于那一个函数,命名变量是全局变量,不应编译为局部变量。

i是个问题,而testj却不是问题的原因是,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()
相关问题