欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[知识总结]函数变量的声明与调用(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解释器是一行一行的执行代码的,而变量查找工作只会在调用变量的时候执行。

所以出现了最后两段代码执行后依然能正常输出的情况。