第五章 python的函数(4):变量的作用域


在本篇,我们来聊一下python中变量的作用域。

什么是变量的作用域?
变量的作用域就是变量的有效范围

  • 全局变量:程序一开始定义的变量
  • 作用域:整个程序
  • 一般用纯大写英文定义
  • 局部变量:函数/类中定义的变量
  • 作用域:定义该变量的函数/类(和子函数/类)
  • 变量的查找顺序:
  • 局部>父级>..>全局

注意:同名的全局变量个局部变量是完全独立的变量,局部变量可以继承全局变量的内存地址

  • 考虑以下代码的执行结果:
g1 = 1

def func1():
    x1 = 'local variable'
    print(x1)
    print(g1)
    print(g2)
    print(g3)
        
g2 = 2
# func1()  # 报错,因为在这里还没有定义g3,所以函数没法打印g3
g3 = 3

func1()

g1 = 1111

def func2():
    print(g1,g2)
    func1()

func2()  # 每次调用函数,相当于将函数体插入这里执行。

函数可以互相调用,但是只能调用在全局定义的函数,嵌套函数不能调用

5.4.2 locals,globals函数

  • locals() 函数可以返回所有局部变量(以字典形式返回)。
  • globals() 函数可以返回所有的全局变量(字典)
g1 = 1  # 全局变量

def func1():
    x1 = 'local variable'  #局部变量
    x2 = 'aaa'  #局部变量
    x3 = 'bbb'  #局部变量
    print(locals())  # 打印局部变量
    print(globals())  # 打印全局变量,也会返回很多默认的全局变量

func1()

执行结果:

{'x1': 'local variable', 'x2': 'aaa', 'x3': 'bbb'}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000191CF8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/kouneli/Desktop/python/temp/test.py', '__cached__': None, 'g1': 1, 'func1': <function func1 at 0x0000000001D1C1E0>}

以上就是python变量作用域的一些介绍。