Python教程-3.5节:Python全局,局部和非局部变量

Python全局,局部和非局部变量

在本文中,您将了解Python全局变量,局部变量,非局部变量以及在何处使用它们。

全局变量

在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:赋值之前引用了局部变量“ x”

输出显示错误,因为Python对待 X 作为局部变量和 X也未在内部定义foo()

为了使这项工作,我们使用global关键字。要了解更多信息,请访问Python全局关键字


局部变量

在函数体内或局部范围内声明的变量称为局部变量。

示例2:访问范围外的局部变量

def foo():
 y = "local"

foo()
print(y)

运行代码

当我们运行代码时,将输出:

NameError:未定义名称“ y”

输出显示错误,因为我们正在尝试访问局部变量 ÿ在全局范围内,而局部变量仅在内部foo()或局部范围内起作用。


让我们看一个有关如何在Python中创建局部变量的示例。

示例3:创建局部变量

通常,我们在函数内部声明一个变量以创建局部变量。

def foo():
 y = "local"
 print(y)

foo()

运行代码

当我们运行代码时,它将输出:

local

让我们来看看前面的问题在那里X 是一个全局变量,我们想修改 X里面foo()


全局和局部变量

在这里,我们将展示如何在同一代码中使用全局变量和局部变量。

示例4:在同一代码中使用全局变量和局部变量

x = "global"

def foo():
 global x
 y = "local"
 x = x * 2
 print(x)
 print(y)
 
foo()

运行代码

当我们运行代码时,将输出:

global global 
local

在上面的代码中,我们声明 X 作为全球性的 ÿ作为中的局部变量foo()。然后,我们使用乘法运算符*来修改全局变量X 而且我们都打印 X 和 ÿ

调用后foo(),的值X成为global global因为我们使用x * 2两次打印global。之后,我们打印局部变量的值ÿ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中创建全局变量的示例。

我们使用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关键字创建一个非局部变量。该inner()功能在另一个功能的范围内定义outer()

注意:如果我们更改非局部变量的值,则更改将显示在局部变量中。

0