跳至内容

Python 作用域

作用域指定了变量生效的范围。根据作用域范围,变量分为三种类型:

  • Local变量
  • Global变量
  • Nonlocal 变量

local变量

函数内声明的变量是local变量(局部变量),这类变量只能在声明的函数内访问,函数外不能访问。

python
def func_greet():
    # local变量
    msg = "hello, w3query"
    print("msg: ", msg)

func_greet()
# ! func_greet() 函数外访问msg变量
print(msg)


# 输出:
# msg: hello, w3query
# NameError: name 'msg' is not defined
def func_greet():
    # local变量
    msg = "hello, w3query"
    print("msg: ", msg)

func_greet()
# ! func_greet() 函数外访问msg变量
print(msg)


# 输出:
# msg: hello, w3query
# NameError: name 'msg' is not defined

这里,msg变量是func_greet函数的局部变量,因此只能在func_greet()函数内使用。函数外访问msg变量,会提示未定义错误。

global变量

Python中,函数外或者global作用域内定义的变量称为global变量(全局变量)。这类变量可以在函数内或者函数外访问。

python
# global变量
msg = "hello, w3query"
def func_greet():
    print("函数内打印msg: ", msg)

func_greet()
# ! func_greet() 函数外访问msg变量
print("函数外打印msg: ", msg)


# 输出:
# 函数内打印msg: hello, w3query
# 函数外打印msg: hello, w3query
# global变量
msg = "hello, w3query"
def func_greet():
    print("函数内打印msg: ", msg)

func_greet()
# ! func_greet() 函数外访问msg变量
print("函数外打印msg: ", msg)


# 输出:
# 函数内打印msg: hello, w3query
# 函数外打印msg: hello, w3query

这里,由于创建的msg变量是全局变量,因此函数内和函数外都能打印出来。

nonlocal变量

nonlocal变量用在嵌套函数(未定义局部作用域)内,这类变量既不能在local作用域,也不能在global作用域访问。

Python中,用 nonlocal 关键字定义nonlocal变量。

python
def func_outer():
    # 定义local变量
    msg = "local"

    # 嵌套函数
    def func_inner():
        # 定义nonlocal变量
        nonlocal msg
        msg = "nonlocal"
        print("func_inner: ", msg)

    func_inner()
    print("func_outer: ", msg)

func_outer()


# 输出:
# func_inner: nonlocal
# func_outer: nonlocal
def func_outer():
    # 定义local变量
    msg = "local"

    # 嵌套函数
    def func_inner():
        # 定义nonlocal变量
        nonlocal msg
        msg = "nonlocal"
        print("func_inner: ", msg)

    func_inner()
    print("func_outer: ", msg)

func_outer()


# 输出:
# func_inner: nonlocal
# func_outer: nonlocal

注意

如果修改一个nonlocal变量,同名的local变量也将会改变。