Python中的全局变量和局部变量简介

已发表: 2021-08-26

Python 以一种非常特立独行的方式处理变量。 虽然许多编程语言默认将变量视为全局变量(除非声明为局部变量),但 Python 将变量视为局部变量,除非反过来声明。 Python默认将变量视为局部变量的驱动原因是使用全局变量通常被认为是糟糕的编码习惯。

因此,在 Python 中编程时,当变量定义发生在函数中时,默认情况下它们是本地的。 您在函数体中对此变量所做的任何修改或操作都将仅保留在此函数的范围内。 或者,换句话说,这些变化不会反映在函数之外的任何其他变量中,即使该变量与函数的变量同名。 所有变量都存在于定义它们的函数范围内并保存该值。 要获得 Python 变量和项目的实践经验,请尝试我们从美国最好的大学获得的数据科学认证。

通过本文,让我们探讨 Python 中局部变量和全局变量的概念,以及如何定义全局变量。 我们还将看一些被称为“非局部变量”的东西。

继续阅读!

目录

Python 中的全局变量和局部变量

让我们看一个示例来了解如何在 Python 中的函数体内使用全局值:

程序:

定义函数():

打印(字符串)

string = “我爱 Python!”

函数()

输出

我爱蟒蛇!

如您所见,变量字符串的值是“我爱 Python!” 在调用 func() 之前。 函数体只包含 print 语句。 由于函数体内没有对字符串变量进行赋值,因此它将取而代之的是全局变量的值。

结果,输出将是变量字符串的全局值,在这种情况下,是“我爱 Python!”。

现在,让我们更改 func() 中字符串的值,看看它如何影响全局变量:

程序:

定义函数():

string = “我爱 Java!”

打印(字符串)

string = “我爱 Python!”

函数()

打印(字符串)

输出:

我爱Java!

我爱蟒蛇!

在上面的程序中,我们定义了一个函数 func(),在其中,我们有一个变量字符串,其值为“I love Java!”。 所以,这个变量是函数 func() 的局部变量。 然后,我们像之前一样拥有全局变量,然后我们调用函数和 print 语句。 首先,函数被触发,调用该函数的 print 语句并传递输出“我爱 Java!” – 这是该函数的局部变量。 然后,一旦程序超出了函数的范围,s 的值就会变为“I love Python”,这就是我们将这两行都作为输出的原因。

现在,让我们添加前两个示例,并尝试使用 print 语句访问字符串,然后尝试为其分配一个新值。 本质上,我们试图创建一个字符串作为局部变量和全局变量。

幸运的是,Python 不允许这种混淆并引发错误。 这是如何做:

程序:

定义函数():

打印(字符串)

string = “我爱 Java!”

打印(字符串)

string = “我爱 Python!”

函数()

输出(错误):

———————————————————————————

UnboundLocalError Traceback(最近一次调用最后一次)

<模块>中的<ipython-input-3-d7a23bc83c27>

5

6 字符串 = “我爱 Python!”

——> 7 函数()

<ipython-input-3-d7a23bc83c27> 在 func()

1个定义函数():

—> 2 打印(字符串)

3 字符串 = “我爱 Java!”

4 打印(字符串)

5

UnboundLocalError:分配前引用的局部变量's'

显然,Python 不允许变量在函数内部既是全局变量又是局部变量。 因此,它为我们提供了一个局部变量,因为我们在 func() 中为字符串赋值。 结果,第一个打印语句显示错误通知。 在任何函数范围内创建或更改的所有变量都是局部变量,除非它们已明确声明为“全局”。

在 Python 中定义全局变量

需要 global 关键字来通知 Python 我们正在访问全局变量。 这是如何做:

程序:

定义函数():

全局字符串

打印(字符串)

string = “但我也想学 Python!”

打印(字符串)

string = “我正在学习 Java!”

函数()

打印(字符串)

输出:

我正在寻找学习Java!

但我也想学习Python!

但我也想学习Python!

从输出中可以看出,Python 识别出这里的全局变量并相应地评估 print 语句,给出适当的输出。

在嵌套函数中使用全局变量

现在,让我们看看如果在嵌套函数中使用全局变量会发生什么。 查看此示例,其中定义了变量“语言”并在各种范围内使用:

程序:

定义函数():

语言 = “英语”

定义函数1():

全球语言

语言 = “西班牙语”

print(“调用 func1 之前:” + 语言)

print("现在调用 func1:")

函数1()

print("调用 func1 后:" + 语言)

函数()

print("main 中语言的值:" + 语言)

输出:

调用 func1 之前:英文

现在调用 func1:

调用func1后:英文

主要语言的价值:西班牙语

如您所见,在嵌套的 func1 中使用 global 关键字时,对父函数的变量“语言”没有影响。 即,该值被保留为“English”。 这也表明在调用 func() 之后,模块命名空间中存在一个变量“language”,其值为“Spanish”。

这一发现也与我们在上一节中发现的一致——一个变量,当在函数体中定义时,除非另有说明,否则总是局部的。 但是,也应该有一种机制来访问属于不同其他范围的变量。

这就是非局部变量的用武之地!

非局部变量

非局部变量是 Python3 引入的一种新鲜变量。 这些与全局变量有很多共同点,也非常重要。 但是,非局部变量和全局变量之间的一个区别是,非局部变量无法从模块范围内更改变量。

查看以下示例以了解这一点:

程序:

定义函数():

全球语言

打印(语言)

语言 = “德语”

函数()

输出:

德语

正如预期的那样,程序返回“Frankfurt”作为输出。 现在,让我们将“全局”更改为“非本地”,看看会发生什么:

程序:

定义函数():

非本地语言

打印(语言)

语言 = “德语”

函数()

输出:

文件“<ipython-input-9-97bb311dfb80>”,第 2 行

非本地语言

^

SyntaxError:找不到非本地“语言”的绑定

如您所见,上面的程序抛出了一个语法错误。 从这里我们可以理解,非局部赋值只能通过嵌套函数的定义来完成。 非局部变量应该在函数的范围内定义,如果不是这样,它也无法在嵌套范围内找到它的定义。 现在,查看以下程序:

程序:

定义函数():

语言 = “英语”

定义函数1():

非本地语言

语言 = “德语”

print(“调用 func1 之前:” + 语言)

print("现在调用 func1:")

函数1()

print("调用 func1 后:" + 语言)

语言 = “西班牙语”

函数()

print(“'语言' in main: ” + 语言)

输出:

调用 func1 之前:英文

现在调用 func1:

调用 func1 后:德语

主要的“语言”:西班牙语

上述程序有效,因为变量“语言”是在调用 func1() 之前定义的。 如果未定义,我们将收到如下错误:

程序:

定义函数():

#language = “英语”

定义函数1():

非本地语言

语言 = “德语”

print(“调用 func1 之前:” + 语言)

print("现在调用 func1:")

函数1()

print("调用 func1 后:" + 语言)

语言 = “西班牙语”

函数()

print(“'语言' in main: ” + 语言)

输出:

文件“<ipython-input-11-5417be93b6a6>”,第 4 行

非本地语言

^

SyntaxError:找不到非本地“语言”的绑定

但是,如果我们将 nonlocal 替换为 global,该程序将正常工作:

程序:

定义函数():

#language = “英语”

定义函数1():

全球语言

语言 = “德语”

print("在调用 func1` 之前:" + 语言)

print("现在调用 func1:")

函数1()

print("调用 func1 后:" + 语言)

语言 = “西班牙语”

函数()

print(“'语言' in main: ” + 语言)

输出:

调用 func1 之前:英文

现在调用 func1:

调用 func1 后:德语

主要的“语言”:德语

如果您注意到,全局变量(语言)的值也在上述程序中发生了变化! 这就是非局部变量带来的力量!

综上所述

在本文中,我们讨论了 Python 中的局部变量、全局变量和非局部变量,以及您应该注意的不同用例和可能的错误。 有了这些知识,您就可以继续练习不同类型的变量并注意细微的差异。

Python 是一种在全球范围内非常流行的编程语言——尤其是在解决与数据相关的问题和挑战方面。 在 upGrad,我们在 85 多个国家/地区拥有学习者基础,在全球拥有 40,000 多名付费学习者,我们的计划影响了超过 500,000 名在职专业人士。 我们的数据科学和机器学习课程旨在帮助任何背景的积极进取的学生开始他们的旅程并在数据科学领域取得优异成绩。 我们的 360 度职业帮助确保一旦您加入我们,您的职业生涯只会向上发展。 立即联系我们,体验同行学习和全球网络的力量!

Python中的变量有哪些类型?

根据它们的作用域,Python 中的变量可以是局部的、全局的或非局部的。

可以从函数内部访问 Python 中的全局变量吗?

是的,可以从 Python 中的函数内部访问全局变量。

局部变量和全局变量有什么区别?

全局变量将整个程序作为其作用域,而局部变量仅将定义它们的函数作为其作用域。