python中变量的作用域 我刚刚遇到一个混乱,让我们考虑下面2个代码

python中变量的作用域 我刚刚遇到一个混乱,让我们考虑下面2个代码,python,Python,第一个代码: def out(): #func1 print i i=5 Output:5 第二: def inc(): #func2 i=i+1 print i i=5 在执行上述程序时,func1没有给出任何错误,但func2给出了一个错误 error: var i referenced before assignment 我不知道我是局部变量还是全局变量。如果它是局部变量,那么func1如何访问它,如果它是全局变量

第一个代码:

def out():        #func1
    print i
i=5

Output:5
第二:

def inc():        #func2
        i=i+1
        print i
i=5
在执行上述程序时,func1没有给出任何错误,但func2给出了一个错误

error: var i referenced before assignment

我不知道我是局部变量还是全局变量。如果它是局部变量,那么func1如何访问它,如果它是全局变量,那么为什么func2无法访问它?

您需要在func2中将
I
声明为
global
,才能修改它的值

def func_2():
    global i
    i=i+1
    print i
如果没有
global
语句,您将把一个局部变量递增到
func_2
,而实际上不首先给它一个值。这就是你的错误的来源

可以打印全局变量的内容,而无需将其声明为全局变量。您也可以在不使用全局语句的情况下访问列表和字典等可变容器,但是字符串、整数、浮点数等都不能在不首先将其设置为全局的情况下进行修改

示例:

>>> i = [1, 2, 3]
>>> def func_3():
...    i.append(4)
...    print i
>>> func_3()
[1, 2, 3, 4]

>>> i = "foo"
>>> def func_4()
...    i = "bar"
...    print i
>>> func_4()
"bar"
>>> print i
"foo"

您需要在func2中将
i
声明为
global
,才能修改其值

def func_2():
    global i
    i=i+1
    print i
如果没有
global
语句,您将把一个局部变量递增到
func_2
,而实际上不首先给它一个值。这就是你的错误的来源

可以打印全局变量的内容,而无需将其声明为全局变量。您也可以在不使用全局语句的情况下访问列表和字典等可变容器,但是字符串、整数、浮点数等都不能在不首先将其设置为全局的情况下进行修改

示例:

>>> i = [1, 2, 3]
>>> def func_3():
...    i.append(4)
...    print i
>>> func_3()
[1, 2, 3, 4]

>>> i = "foo"
>>> def func_4()
...    i = "bar"
...    print i
>>> func_4()
"bar"
>>> print i
"foo"

这取决于,当您使用
=
运算符在函数内部分配变量时,它将隐藏该变量的任何其他外部作用域声明,并使用局部,除非它在函数内部声明为
全局

例如,如果您这样做,您的第二次尝试将按照您的预期进行:

def inc():        #func2
    global i
    i=i+1
    print i
i=5
另一方面,如果没有在函数内部执行赋值,它将使用外部作用域声明,正如您在第一次尝试中看到的那样


此外,如果您使用
全局i
,但没有在外部作用域中定义
i
,则函数也将引发未定义的异常。

这取决于,当您使用
=
运算符在函数内部分配变量时,它将隐藏该变量的任何其他外部作用域声明,并改用局部,除非它在函数中声明为
global

例如,如果您这样做,您的第二次尝试将按照您的预期进行:

def inc():        #func2
    global i
    i=i+1
    print i
i=5
另一方面,如果没有在函数内部执行赋值,它将使用外部作用域声明,正如您在第一次尝试中看到的那样


此外,如果您使用
global i
,但没有在外部范围中定义
i
,则函数也将引发未定义的异常。

See的可能重复See的可能重复这是最好的答案,但您还应解释原因。仅当您打算读取变量的值时,解释器才会查看函数的外部范围。如果您打算写入,解释器将不会查看外部范围,除非您在开始时添加
global i
。这是最好的答案,但您也应该解释原因。仅当您打算读取变量的值时,解释器才会查看函数的外部范围。如果您打算写入它,解释器将不会查看外部作用域,除非您在开头添加
global i
。是的,它不会覆盖其他外部作用域声明。阅读有关名称空间的内容(我想你知道会发生什么,但你没有正确地表达自己)@IonutHulub you's right overrides不是这个词,因为这意味着它会影响外部范围声明。我想阴影是个更好的词吧?我不知道该用什么词LOLI我也不知道确切的词。。。我想荫凉很管用。然而,这绝对是错误的。你要找的词是(它的动词意义)。@user4815162342你找到了!非常感谢,我想树荫已经够近了。对不起,英语不是我的母语:)修好它!是的,它不会覆盖其他外部作用域声明。阅读有关名称空间的内容(我想你知道会发生什么,但你没有正确地表达自己)@IonutHulub you's right overrides不是这个词,因为这意味着它会影响外部范围声明。我想阴影是个更好的词吧?我不知道该用什么词LOLI我也不知道确切的词。。。我想荫凉很管用。然而,这绝对是错误的。你要找的词是(它的动词意义)。@user4815162342你找到了!非常感谢,我想树荫已经够近了。对不起,英语不是我的母语:)修好它!