尝试在Python3中的函数中打印全局变量时出错
在这段简单的代码中,了解全局变量和局部变量的区别:尝试在Python3中的函数中打印全局变量时出错,python,python-3.x,function,scope,global,Python,Python 3.x,Function,Scope,Global,在这段简单的代码中,了解全局变量和局部变量的区别: def sub(): print(a) a="banana" print(a) a="apple" sub() print(a) 我得到一个错误: 未绑定本地错误 回溯(最近一次呼叫最后一次) 在 5 6 a=“苹果” ---->7 sub() 8印刷品(a) 在sub()中 1 def sub(): ---->2打印(a) 3 a=“香蕉” 4打印(a) 五, Unboun
def sub():
print(a)
a="banana"
print(a)
a="apple"
sub()
print(a)
我得到一个错误:
未绑定本地错误
回溯(最近一次呼叫最后一次)
在5
6 a=“苹果”
---->7 sub()
8印刷品(a) 在sub()中
1 def sub():
---->2打印(a)
3 a=“香蕉”
4打印(a)
五, UnboundLocalError:赋值前引用的局部变量“a” 我目前了解到,“a”是一个全局变量,在函数外部声明为 (它不在任何函数上声明,如C中的main()) 但为什么这个错误告诉我‘a’是一个局部变量
我知道如果我在
print(a)
行上方添加global a
将解决此错误,但我想知道原因。Python将此行解释为:函数中的a=“banana”
作为新的局部变量a
的定义。函数范围内的此变量替换全局变量a
。请注意,print(a)
(引用局部变量a
)出现在之前a=“banana”
(=赋值)。因此您会得到错误:UnboundLocalError:assignment之前引用的局部变量“a”
另请参见:Python将函数中的这一行:
a=“banana”
解释为新的局部变量a
的定义。函数范围内的此变量替换全局变量a
。请注意,print(a)
(引用局部变量a
)出现在之前a=“banana”
(=赋值)。因此您会得到错误:UnboundLocalError:assignment之前引用的局部变量“a”
另请参见:主要原因是 印刷品(a) 在函数内部,将变量“a”设置为该函数的局部变量(即局部范围)。忽略 a=“苹果” 在函数外部定义 由于'a'值尚未在'sub'函数内初始化,因此在执行print(a)时无法找到其值,因此显示 局部变量“a”在赋值之前引用,这正是上述情况下发生的情况 总结
def sub():
# print(a) #Just comment this and you will understand the difference
## By doing print(a) inside sub function makes sets 'a' as local variable
## whose value has not been initialized
## and as its value couldn't be found while line print(a) executes hence shows
## local variable 'a' referenced before assignment which is exactly what
## happens
a="banana" # a is assigned here
print(a)
a="apple"
sub()
print(a)
主要原因是 印刷品(a) 在函数内部,将变量“a”设置为该函数的局部变量(即局部范围)。忽略 a=“苹果” 在函数外部定义 由于'a'值尚未在'sub'函数内初始化,因此在执行print(a)时无法找到其值,因此显示 局部变量“a”在赋值之前引用,这正是上述情况下发生的情况 总结
def sub():
# print(a) #Just comment this and you will understand the difference
## By doing print(a) inside sub function makes sets 'a' as local variable
## whose value has not been initialized
## and as its value couldn't be found while line print(a) executes hence shows
## local variable 'a' referenced before assignment which is exactly what
## happens
a="banana" # a is assigned here
print(a)
a="apple"
sub()
print(a)
简短的版本是,当python编译函数
sub
时,它会看到a
被声明为内部变量,并立即在全局范围内隐藏该变量(而不是等待相关代码行实际运行)。然后,当代码确实运行时,它还没有被分配,所以您得到了错误。这仅仅是因为函数中a的作用域。范围从局部开始,然后到全局。但是因为您在函数的范围内声明了一个“a”。您将得到该错误预分配错误。这意味着它已经识别出a存在于函数范围内,但只是在print()之后被引用。简短的版本是,当python编译函数sub
时,它看到a
被声明为函数范围内的变量,并立即将该变量隐藏在全局范围内(而不是等待相关代码行实际运行)。然后,当代码确实运行时,它还没有被分配,因此您会得到错误。这只是因为函数中a的作用域。作用域从局部开始,然后到全局。但是因为您在函数的作用域内声明了“a”。您将得到错误预分配错误。这意味着它已识别出a存在于函数范围内,但仅在print()之后引用现在我明白了。谢谢。我忘了Python不会像C一样逐行读取。实际上,大多数时候,Python似乎会先读取源代码的每一行,然后在查看下一行之前“执行”它。在这种情况下,编译器正试图为函数创建字节码,但意识到这是一个矛盾。请参阅视频以获得精彩的答案nd几乎完成了解释。现在我明白了。谢谢。我忘了Python不像C那样逐行读取。实际上,大多数时候,Python似乎会先读取源代码的每一行并“执行”它,然后再查看下一行。在这种情况下,编译器正试图为函数创建字节码,但意识到存在矛盾n、 请参阅视频以获得精彩且几乎完整的解释。