[知识总结]函数变量的声明与调用(Python)
程序员文章站
2022-07-15 12:50:57
...
学过python命名空间的都应该知道,当一个函数在执行时需要调用某个变量的时候,他会按照一定的顺序查找这个变量,如果找到就调用,找不到就报错NameError(一般情况下会报错提示你这个变量未被定义)。
一般的查找顺序是:(暂不讨论闭包等特殊情况)
函数内部临时变量→父函数临时变量(存在嵌套函数的情况)→模块内部变量(一般叫全局变量)→python内置变量
下面我们来看一些例子:
a = 1
def test():
a = 2
def inner():
a = 3
print(a)
inner()
test() #结果为3
a = 1
def test():
a = 2
def inner():
#a = 3
print(a)
inner()
test() #结果为2
a = 1
def test():
#a = 2
def inner():
#a = 3
print(a)
inner()
test() #结果为1
上面三段代码我想大部分人都能够理解,现在我们将代码改成下面的样子:
a = 1
def test():
a = 2
def inner():
#a = 3
print(a)
a = 3
inner()
test() #结果是报错,变量a在声明前被调用
a = 1
def test():
#a = 2
def inner():
#a = 3
print(a)
inner()
a = 2
test() #结果也是报错,变量a在声明前被调用
这也容易理解,调用前应该先声明,我们再来改一下代码:
a = 1
def test():
#a = 2
def inner():
#a = 3
print(a)
a = 2
inner()
test() #结果2
#a = 1
def test():
#a = 2
def inner():
#a = 3
print(a)
inner()
a = 1
test() #结果1
上面两段代码中,a变量的定义声明都写在了函数定义之后。第一段a=2写在了inner()函数定义之后,第二段a=1写在了test()函数定义之后,但是函数调用时都没有出现问题。
这是因为,在python中,定义函数的时候并不会去执行变量查找操作,python解释器只是分配了相应的命名空间内存,将变量名存入,至于这个变量在定义前究竟有没有被声明,解释器并不关心。
但是在函数执行,需要调用该变量时,解释器就会按照本文一开始介绍的顺序去查找变量,需要注意的是:只要这个变量在调用前被声明,他就可以被查找到,因为python解释器是一行一行的执行代码的,而变量查找工作只会在调用变量的时候执行。
所以出现了最后两段代码执行后依然能正常输出的情况。