蚊章汇 - Programiz
type: channel
link: https://linuxcn.bwsl.wang/author/920/
description: Programiz
items: 初识 Python：全局、局部和非局部变量（带示例）
items: 初识 Python： global 关键字

初识 Python：全局、局部和非局部变量（带示例）
type: item
date: 2018-05-12T18:47:00+08:00
description: 全局变量在 Python 中，在函数之外或在全局范围内声明的变量被称为全局变量。 这意味着，全局变量可以在函数内部或外部访问。我们来看一个关于如何在 Python 中创建一个全局变量的示例。示例 1：创建全局变量x = "global" def foo(): print("x inside :", x) foo() print("x outside:", x) 当我们运行代码时，将会输出：x inside : global x outside: global 在上面的代码中，我们创建了 x 作为全局变量，并定义了一个 foo() 来打印全局变量 x。 最后，我们调用 foo() 来打印x的值。倘若你想改变一个函数内的 x 的值该怎么办？x = "global" def foo(): x = x * 2 print(x) foo() 当我们运行代码时，将会输出：UnboundLocalError: local variable 'x' referenced before assignment 输出显示一个错误，因为 Python 将 x 视为局部变量，而 x 没有在 foo() 内部定义。为了运行正常，我们使用 global 关键字，查看 PythonGlobal 关键字以便了解更多。局部变量在函数体内或局部作用域内声明的变量称为局部变量。示例 2：访问作用域外的局部变量def foo(): y = "local" foo() print(y) 当我们运行代码时，将会输出：NameError: name 'y' is not defined 输出显示了一个错误，因为我们试图在全局范围内访问局部变量 y，而局部变量只能在 foo() 函数内部或局部作用域内有效。我们来看一个关于如何在 Python 中创建一个局部变量的例子。示例 3：创建一个局部变量通常，我们在函数内声明一个变量来创建一个局部变量。def foo(): y = "local" print(y) foo() 当我们运行代码时，将会输出：local 让我们来看看前面的问题，其中x是一个全局变量，我们想修改 foo() 内部的 x。全局变量和局部变量在这里，我们将展示如何在同一份代码中使用全局变量和局部变量。示例 4：在同一份代码中使用全局变量和局部变量x = "global" def foo(): global x y = "local" x = x * 2 print(x) print(y) foo() 当我们运行代码时，将会输出（LCTT 译注：原文中输出结果的两个 global 有空格，正确的是没有空格）：globalglobal local 在上面的代码中，我们将 x 声明为全局变量，将 y 声明为 foo() 中的局部变量。 然后，我们使用乘法运算符 * 来修改全局变量 x，并打印 x 和 y。在调用 foo() 之后，x 的值变成 globalglobal了（LCTT 译注：原文同样有空格，正确的是没有空格），因为我们使用 x * 2 打印两次 global。 之后，我们打印局部变量y的值，即 local 。示例 5：具有相同名称的全局变量和局部变量x = 5 def foo(): x = 10 print("local x:", x) foo() print("global x:", x) 当我们运行代码时，将会输出：local x: 10 global x: 5 在上面的代码中，我们对全局变量和局部变量使用了相同的名称 x。 当我们打印相同的变量时却得到了不同的结果，因为这两个作用域内都声明了变量，即 foo() 内部的局部作用域和 foo() 外面的全局作用域。当我们在 foo() 内部打印变量时，它输出 local x: 10，这被称为变量的局部作用域。同样，当我们在 foo() 外部打印变量时，它输出 global x: 5，这被称为变量的全局作用域。非局部变量非局部变量用于局部作用域未定义的嵌套函数。 这意味着，变量既不能在局部也不能在全局范围内。我们来看一个关于如何在 Python 中创建一个非局部变量的例子。（LCTT 译者注：原文为创建全局变量，疑为笔误）我们使用 nonlocal 关键字来创建非局部变量。示例 6：创建一个非局部变量def outer(): x = "local" def inner(): nonlocal x x = "nonlocal" print("inner:", x) inner() print("outer:", x) outer() 当我们运行代码时，将会输出：inner: nonlocal outer: nonlocal 在上面的代码中有一个嵌套函数 inner()。 我们使用 nonlocal 关键字来…

初识 Python： global 关键字
type: item
date: 2018-04-20T05:44:00+08:00
description: 在读这篇文章之前，确保你对 Python 全局、局部和非局部变量 有一定的基础。global 关键字简介在 Python 中，global 关键字允许你修改当前范围之外的变量。它用于创建全局变量并在本地上下文中更改变量。global 关键字的规则在 Python 中，有关 global 关键字基本规则如下：当我们在一个函数中创建一个变量时，默认情况下它是本地变量。当我们在一个函数之外定义一个变量时，默认情况下它是全局变量。你不必使用 global 关键字。我们使用 global 关键字在一个函数中来读写全局变量。在一个函数外使用 global 关键字没有效果。使用 global 关键字（含示例）我们来举个例子。示例 1：从函数内部访问全局变量c = 1 # 全局变量 def add(): print(c) add() 运行程序，输出为：1 但是我们可能有一些场景需要从函数内部修改全局变量。示例 2：在函数内部修改全局变量c = 1 # 全局变量 def add(): c = c + 2 # 将 c 增加 2 print(c) add() 运行程序，输出显示错误：UnboundLocalError: local variable 'c' referenced before assignment 这是因为在函数中，我们只能访问全局变量但是不能修改它。解决的办法是使用 global 关键字。示例 3：使用 global 在函数中改变全局变量c = 0 # global variable def add(): global c c = c + 2 # 将 c 增加 2 print("Inside add():", c) add() print("In main:", c) 运行程序，输出为：Inside add(): 2 In main: 2 在上面的程序中，我们在 add() 函数中定义了 c 将其作为全局关键字。然后，我们给变量 c 增加 2，即 c = c + 2。之后，我们调用了 add() 函数。最后，打印全局变量 c。正如我们所看到的，在函数外的全局变量也发生了变化，c = 2。Python 模块中的全局变量在 Python 中，我们创建一个单独的模块 config.py 来保存全局变量并在同一个程序中的 Python 模块之间共享信息。以下是如何通过 Python 模块共享全局变量。示例 4：在Python模块中共享全局变量创建 config.py 文件来存储全局变量a = 0 b = "empty" 创建 update.py 文件来改变全局变量import config config.a = 10 config.b = "alphabet" 创建 main.py 文件来测试其值的变化import config import update print(config.a) print(config.b) 运行 main.py，输出为：10 alphabet 在上面，我们创建了三个文件： config.py, update.py 和 main.py。在 config.py 模块中保存了全局变量 a 和 b。在 update.py 文件中，我们导入了 config.py 模块并改变了 a 和 b 的值。同样，在 main.py 文件，我们导入了 config.py 和 update.py 模块。最后，我们打印并测试全局变量的值，无论它们是否被改变。在嵌套函数中的全局变量以下是如何在嵌套函数中使用全局变量。示例 5：在嵌套函数中使用全局变量def foo(): x = 20 def bar(): global x x = 25 print("Before calling bar: ", x) print("Calling bar now") bar() print("After calling bar: ", x) foo() print("x in main : ", x) 输出为：Before calling bar: 20 Calling bar now After calling bar: 20 x in main : 25 在上面的程序中，我们在一个嵌套函数 bar() 中声明了全局变量。在 foo() 函数中， 变量 x 没有全局关键字的作用。调用 bar() 之前和之后， 变量 x 取本地变量的值，即 x = 20。在 foo() 函数之外，变量 x 会取在函数 bar() 中的值，即 x = 25。这是因为在 bar() 中，我们对 x 使用 global 关键字创建了一个全局变量（本地范围）。如果我们在 bar() 函数内进行了任何修改，那么这些修改就会出现在本地范围之外，即 foo()。via: https:…