Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试在Python3中的函数中打印全局变量时出错_Python_Python 3.x_Function_Scope_Global - Fatal编程技术网

尝试在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、 请参阅视频以获得精彩且几乎完整的解释。