【Python基础】变量的作用域与global、nonlocal

在 Python 中,变量的作用域指的是变量可以被访问的范围。Python 中的变量作用域有两种:

  • 局部作用域:变量在函数函数内部的时候,只能在函数内部使用。这样的变量被称为局部变量。
    • 如果在函数内部定义了一个变量,那么该变量只能在函数内部使用,如果想要在函数外部访问该变量,需要使用return语句将其返回。
  • 全局作用域:变量在函数外部定义的时候,可以在任何地方访问。这样的变量被称为全局变量。
    • 如果你在函数外部定义了一个变量,那么该变量可以在任何地方访问,包括函数内部和外部。

global

如果你想在函数内部修改全局变量的值,可以使用global关键字。例如:

x = 10  # 全局变量
def foo():
	"""需要注意的是,如果在内部定义了局部变量,那么在这之前访问该变量将会报错"""
    x = 30
    print("函数内部尝试修改全局变量x为", x)  # 函数内部尝试修改全局变量x为 30
foo()
print("最终的全局变量x", x)  # 最终的全局变量x 10
def foo1():
	"""在这里,如果在global声明之前访问了x,那么x就会被定义为局部变量,那么再次声明global x 将会报错"""
    global x
    x = 20  # 修改全局变量
    print("函数内部尝试使用global修改x为", x)  # 函数内部尝试使用global修改x为 20
foo1()
print("最终的全局变量x为", x) # 最终的全局变量x为 20

在上面的代码中,我们使用global关键字在函数内部声明了x为全局变量。然后在函数内部修改了x的值。最后,在函数外部打印x的值,输出的结果为20。

需要注意的是,在使用global关键字之前,必须先在函数外部定义该全局变量。否则,Python 会将该变量视为局部变量,而不是全局变量。

此外,在函数内部不要滥用global关键字,应该尽可能地避免修改全局变量的值,以避免出现意外的错误。


nonlocal

nonloca用于在嵌套函数中使用变量,其中变量不应属于内部函数。使用 nonlocal 关键字声明该变量不是局部变量。nonlocal 语句使列出的标识符引用最近的封闭范围中以前绑定的变量,不包括全局变量。nonlocal 关键字不能用于局部或全局变量,因此必须用于引用除全局和局部范围之外的另一个范围中的变量。
下面是一个简单的示例,演示了如何在嵌套函数中使用 nonlocal 关键字:

def outer():
    x = "local"
    def inner():
        nonlocal x  # 在 inner 函数中使用 nonlocal 关键字来声明 x 变量不是局部变量
        x = "nonlocal"  # 在 inner 函数中更改 x 变量的值时,它实际上更改的是 outer 函数中的 x 变量
        print("inner:", x)
    inner()
    print("outer:", x)
outer()
# 输出inner: nonlocal
# 输出outer: nonlocal
关于nonlocal有几点需要注意的
  1. nonlocal 关键字只能在嵌套函数中使用。如果在非嵌套函数中使用 nonlocal 关键字,Python 解释器会抛出 SyntaxError。
  2. nonlocal 关键字不能用于局部或全局变量。它只能用于引用除全局和局部范围之外的另一个范围中的变量。
  3. nonlocal 关键字只能用于已经在封闭范围中绑定的变量。如果在封闭范围中没有找到变量,Python 解释器会抛出 SyntaxError。
  4. nonlocal 关键字不能用于改变不可变数据类型(如字符串、元组或数字)的值。它只能用于改变可变数据类型(如列表或字典)的值。
posted @ 2023-03-06 15:42  'Radio'  阅读(13)  评论(0编辑  收藏  举报  来源