对python变量范围的质疑

对python变量范围的质疑,python,scope,Python,Scope,可能重复: 我编写了两个简单的函数: # coding: utf-8 def test(): var = 1 def print_var(): print var print_var() print var test() # 1 # 1 def test1(): var = 2 def print_var(): print var var = 3 print_var()

可能重复:

我编写了两个简单的函数:

# coding: utf-8
def test():
    var = 1 
    def print_var():
        print var 
    print_var()
    print var 

test()
# 1
# 1
def test1():
    var = 2 
    def print_var():
        print var 
        var = 3 
    print_var()
    print var 

test1()
# raise Exception

相比之下,
test1()
print var
之后赋值,然后引发一个异常:
UnboundLocalError:赋值之前引用的局部变量'var',我想在调用internal
print var
时,var的值是2,我错了吗?

是的,这里你错了。函数定义引入了一个新的作用域

# coding: utf-8
def test():
    var = 1 
    def print_var():
        print var    <--- var is not in local scope, the var from outer scope gets used
    print_var()
    print var 

test()
# 1
# 1
def test1():
    var = 2 
    def print_var():
        print var     <---- var is in local scope, but not defined yet, ouch
        var = 3 
    print_var()
    print var 

test1()
# raise Exception
#编码:utf-8
def test():
var=1
def print_var():

print var请参见此链接:@HansThen:No,此处使用
global
声明没有帮助,因为
var
是一个函数范围变量。在Python3中,您会使用
非本地的
,但在Python2中(这里使用的),您无法完成OP试图完成的任务。等等,我认为python在执行时没有向前看。python如何知道
var
将成为第二个
print\u var
函数中的一个局部变量?因此,当python解析该函数时,它会保存一个列表,其中包含分配给该函数的所有变量的名称。然后在调用时,它会看到
var
在这个列表中,并且会抱怨,因为它还没有定义。这个局部变量列表可以访问吗?@lazyr:完全可以;变量在编译时绑定到一个作用域。赋值是一种存储操作,除非标记为全局,否则会将该变量绑定到局部作用域。如果没有赋值,则变量为“free”,并在周围的作用域中查找,但这也绑定到该特定作用域。例如,请参阅。@Martijn我可以访问函数的作用域并查看它的局部变量是什么吗?@lazyr:是的,请参阅,
a函数。func\u code.co\u varnames
是局部变量
co_freevars
co_cellvars
在这方面很有趣;它们分别是取自周围范围(非全局)的变量和嵌套函数引用的变量。