目录
介绍
概述
目录
Python中有什么变量?
全局变量
本地变量
命名空间是什么?
Python中有哪些可变范围?
LEGB规则是什么?
Python可变范围如何?
1。在本地范围中使用全局变量
输出
2.在本地范围中使用本地变量
3。修改本地范围内的全局变量
4。使用声明修改本地范围内部的全局变量
5。使用功能修改全局变量inside本地范围
什么是嵌套功能?
变量的封闭范围是什么?
7.修改封闭范围内无声明的全局变量
8。使用声明在本地范围内修改嵌套变量
结论
常见问题
首页 科技周边 人工智能 Python名称空间和可变范围的综合指南

Python名称空间和可变范围的综合指南

Apr 12, 2025 pm 12:00 PM

介绍

了解Python函数中变量的名称空间,范围和行为对于有效编写和避免运行时错误或异常至关重要。在本文中,我们将深入研究名称空间和Python变量范围的各个方面,并了解Python如何详细管理本地,全局和封闭变量。

我们已经详细讨论了Python的功能,可以建立。 Python使用抽象原理隐藏复杂的逻辑并仅公开必要的输出,分解产生模块化,可读和可重复使用的功能。

这些原理足够明显,可以理解Python如何处理其可变范围用于函数定义和嵌套功能,我们将通过详细的示例探索。到本文结尾,您应该清楚地了解这些概念以及如何在程序中有效地应用它们。

Python名称空间和可变范围的综合指南

概述

  • Python的命名空间和可变范围对于有效的预防编码和误差至关重要。
  • 本文探讨了python中的本地,全局和封闭变量的行为。
  • LEGB规则描述了Python在不同范围内的变量名称搜索。
  • 实际示例证明了全球和局部变量的使用和修改。
  • 涵盖了嵌套功能和封闭范围,强调了非本地关键字。

目录

  • Python中有什么变量?
    • 全局变量
    • 本地变量
  • 命名空间是什么?
  • Python中有哪些可变范围?
  • LEGB规则是什么?
  • Python可变范围如何?
    • 1。在本地范围中使用全局变量
    • 2.在本地范围中使用本地变量
    • 3。修改本地范围内的全局变量
    • 4.使用声明对本地范围内部内部变量进行修改
    • 5。使用功能修改全局变量inside本地范围
  • 什么是嵌套功能?
  • 变量的封闭范围是什么?
    • 7.修改封闭范围内无声明的全局变量
    • 8。使用声明在本地范围内修改嵌套变量
  • 常见问题

Python中有什么变量?

Python中的变量是存储数据或值(例如INT,Float,Str,Bool等)的容器。存储变量且也可以访问的内存位置称为变量的theScope。

Python中有两种类型的变量,即:

全局变量

  • 这些变量属于主要程序的范围。
  • 主程序不能使用本地变量,因为它仅适用于函数。

本地变量

  • 这些变量属于功能范围。
  • 同样,当未在本地范围内定义本地变量时,本地变量可以使用函数内部的全局变量。

另请阅读:Python中的可变与不变的物体

命名空间是什么?

Python名称空间是Aspace或字典,将标识符(通常称为变量名称)作为其键及其各自对象作为内存空间中的值。 Python编程语言具有44种类型的名称空间,即:

  • 内置名称空间
  • 全局名称空间
  • 封闭名称空间
  • 本地名称空间

我们很快将研究不同的示例,以更好地理解这个概念。但是在此之前,了解上面提到的可变范围确实很重要。

Python中有哪些可变范围?

在Python中,范围是指直接访问变量的程序区域或文本区域。在执行过程中的任何时候,都有:

  • 本地范围:这是函数内定义的最内在范围。对于此范围,Python寻找局部变量。
  • 封闭范围:这些是嵌套函数的范围。它们包含既不局部也不全球的非本地变量。
  • 全局范围:此范围包含在模块级别定义的变量,并且可以在整个模块中访问。

注意:您在程序中创建这些用户定义的范围以有效地运行它。但是,Python的内置变量也具有称为内置范围的范围。

  • 内置范围:这是Python提供的所有预定义关键字或方法的范围。因此,一旦Python解释器启动,这些都可以为您提供。另外,请注意,这些范围永远不会被删除,并且可以在整个模块中访问。

LEGB规则是什么?

现在,您对命名空间和可变范围有基本的了解。让我们更深入地了解如何用Python编程语言应用范围。有一个常见的缩写,legb规则,它可以实现广阔的,封闭的,全球和建筑物。

LEGB规则指出,解释器可以从内而外搜索标识符,这意味着它首先在本地范围中寻找可变名称或名称空间开始。如果在那里没有名称空间,它将朝着程序的封闭范围迈进。 Ext,它检查全局范围以找到名称空间。最后,如果仍未找到标识符,解释器会查看Python提供的内置范围。

Python名称空间和可变范围的综合指南

此外,如果解释器在这些位置的任何一个中都找不到名称,则Python提出了“ nameError”异常,这意味着该变量在程序中未定义。

同样,要记住,您必须从当前范围的LEGB规则的层次结构上向上移动

另请阅读:高级Python编程的综合指南

Python可变范围如何?

现在,让我们从所有这些示例中进行一对一的了解,以深入了解所有这些概念:

1。在本地范围中使用全局变量

为了理解这一点,让我们以一个例子为例,这里的函数` g(y) `不仅打印了全局变量` x```x ',还将其修改为` x 1 '。

现在,由于在g(y)'中未定义X` ,因此python获取了全局变量` x '的值。

 def g(y):
  打印(x)
  打印(x 1)

#由于x不在本地范围中
x = 1
g(x)#全局本地变量
打印(x)#全局变量
登录后复制

输出

1<br><br> 2<br><br> 1
登录后复制

输出显示了“ x ”和“ x 1 ”的值确认全局变量X`保持不变,但本地范围已使用它来正确输出结果。

2.在本地范围中使用本地变量

现在,查看此示例,在这里我们有一个函数定义` g(y) ```g( y )```g'g'g',name x`定义为局部变量,也修改了。

 def g(y):
  x = 10#本地变量
  x = 1
  打印(x)


x = 1#全局变量
g(x)
打印(x)
登录后复制

输出

11<br><br> 1
登录后复制

作为证据,全局“ X ”保持不变,局部变量使用其局部范围变量来打印陈述,如预期的那样,通过函数通过函数将11作为输出和1个输出,如所预期的。

另请阅读:Python内置数据结构的综合指南

3。修改本地范围内的全局变量

但是,是否可以在不将其声明为`` global ''的情况下修改全局变量'?

答案是否!您不能从本地范围修改任何全局变量值,因为这样做将导致错误。

 def h(y):

  #功能可以使用全局变量,如果没有任何
  x = 10#,但无法更改本地变量内的全局值

x = 1
H(x)
打印(x)
登录后复制

输出

Unboundlocalerror Trackback(最近的最新电话)<br><br> <ipython-input-3-130c677cc9ab>在<cell line>()<br><br> 3<br><br> 4 x = 1<br><br> ----> 5 h(x)<br><br> 6印刷(x)<br><br> <ipython-input-3-130c677cc9ab>在h(y)中<br><br> 1def H(y):<br><br> -----> 2 x = 10<br><br> 3<br><br> 4 x = 1<br><br> 5 h(x)</ipython-input-3-130c677cc9ab></cell></ipython-input-3-130c677cc9ab>
登录后复制

unboundlocalerror:分配前引用的本地变量

这会导致`` unbounlocalerror '',因为由于分配操作,python将x视为局部变量,但尚未在本地初始化。另外,尽管本地变量可以访问全局变量,但您无法更改全局变量(您只能读取,而不是写)。

另请阅读:初学者Python编程的基本面

4。使用声明修改本地范围内部的全局变量

但是,由于我一直告诉您Python实际上是一种甜美的语言,即使不建议对全局变量进行任何修改或更改。这并不意味着Python并不能给您这个功能,因为使用相同的关键字将`X'称为“ global”,该函数可以修改全局变量`x` x'。

 def h(y):
  全局x#现在可以更改本地变量内的全局值
  #但是,这不是编码的好方法,您应该专注于减少此全局关键字用法
  x = 10

x = 1
H(x)
打印(x)
登录后复制

输出

11
登录后复制

输出确认X`已在全球更新。但是,请记住,更改将影响整个程序,因为修改主函数也会影响其他功能,这不是很好的编程实践。

5。使用功能修改全局变量inside本地范围

另外,您可以通过将x x添加到10中来修改函数内的全局变量它将打印新值并返回。

注意:这并不意味着您正在修改全局变量本身,无论如何,如果没有``global''关键字。

 def g(x):
  x = 10
  打印(“在f(x)中:x =”,x)
  返回x#返回f(x)

x = 2
z = g(x)
打印(“在主要程序范围:z =”,z)
打印(“在主要程序范围:x =”,x)
登录后复制

输出

在f(x)中:x = 12<br><br>在主要程序范围中:z = 12<br><br>在主要程序范围中:x = 2
登录后复制

在这里,全局X`保持不变,而返回的值` z`是新的更新值。

什么是嵌套功能?

在另一个` def`函数中定义的函数称为嵌套函数内部函数

这是一个嵌套功能的示例,可以更好地理解:

 def f():
  def g():
    打印(“内部功能g”)
  g()
  打印(“内部功能F”)

F()
登录后复制

输出

内部功能g<br><br>内部功能f
登录后复制

注意:嵌套函数`` g`在函数`` f ''中调用,从两个函数中打印消息。呼叫函数`` g'f'f'flresults以外的错误,因为在全局范围中未定义`` g '。

 g()#此功能未在函数f之外定义
登录后复制

输出

TypeError Trackback(最近的最新通话)<br><br> <ipython-input-8-5fd69ddb5074>在<cell>()<br><br> -----> 1 g()<br><br> typeError:g()缺少1所需的位置参数:'x'</cell></ipython-input-8-5fd69ddb5074>
登录后复制

变量的封闭范围是什么?

Python仅与嵌套函数中定义的名称(称为封闭范围)提供了不同的特殊变量范围。它也被称为非本地范围。当存在局部函数时,封闭范围是外部函数的范围,该函数是内部或嵌套函数。

 def f():
  x = 1
  def g():
    打印(“内部功能g”)
    打印(x)
  g()
  打印(“内部功能F”)
  
F()
登录后复制

此变量`x`都存在在封闭范围内,您也可以在本地范围中使用,如上所述。这就是IT输出:

输出

内部功能g<br><br> 1<br><br>内部功能f
登录后复制

现在,让我们继续前进,更好地理解这个新范围。

7.修改封闭范围内无声明的全局变量

同样,在嵌套函数内修改全局变量`是不可能的

 def g(x):
  def H():
    x = 1
    打印('in H(x):x =',x)
  x = x 1
  打印('in g(x):x =',x)
  H(x)
  返回x

x = 3
z = g(x)
打印('在主要程序范围:x =',x)
打印('在主要程序范围:z =',z)
登录后复制

输出

在g(x)中:x = 4<br><br> ----------------------------------------------------------------------------------------------------------------------------<br> TypeError Trackback(最近的最新通话)<br><br> <ipython-input-12-5bcfb2edb396>在<cell line>()<br><br> 9<br><br> 10 x = 3<br><br> ---> 11 z = g(x)<br><br> 12打印('在主要程序范围:x =',x)<br><br> 13打印('在主要程序范围:z =',z)<br><br> <ipython-input-12-5bcfb2edb396>在G(x)中<br><br> 5 x = x 1<br><br> 6打印('in g(x):x =',x)<br><br> ----> 7 h(x)<br><br> 8返回x<br><br> 9<br><br> TypeError:g。<locals> .h()获得0个位置参数,但给出了1个</locals></ipython-input-12-5bcfb2edb396></cell></ipython-input-12-5bcfb2edb396>
登录后复制

当函数` h() `时,无需任何参数而定义,但是`h(x)`被称为参数。此外,这将给出一个“ typeError”。尽管封闭变量可以访问全局变量,但您无法在全局变量中执行更改。

8。使用声明在本地范围内修改嵌套变量

与“全局”关键字相似,Python为开发人员提供了“非局部”关键字。这允许嵌套函数` h` h`可以修改封闭函数中定义的变量x

 def g(x):
  def H():
    非局部x#告诉h()使用x(x)的x
    x = 1
    打印('in H(x):x =',x)
  x = x 1
  打印('in g(x):x =',x)
  h()#呼叫h()没有任何参数
  返回x

x = 3
z = g(x)
打印('在主要程序范围:x =',x)
打印('在主要程序范围:z =',z)
登录后复制

输出

在g(x)中:x = 4<br><br>在h(x)中:x = 5<br><br>在主要程序范围中:x = 3<br><br>在主要程序范围:z = 5
登录后复制

输出显示在两个函数中所做的更改,并且全局变量` `X '保持不变。

最后,请注意,根据范围定义的位置,每个范围对应于整个程序中的不同级别访问级别,并且在代码中将具有不同的命名空间寿命。

另请阅读:从头开始学习数据科学的完整的Python教程

结论

本文探讨了Python如何处理本地和全局变量以及嵌套功能。我们了解到,命名空间是Python为开发人员提供的词典,您可以从中找到一个可变名称及其值存储在Python内存范围中的值。此外,这些范围分为四种:本地,封闭,全局和内置。

这些对于避免命名冲突和跟踪哪些名称/标识符是指整个程序不同部分中的哪些对象非常有用。

另外,如果要从本地范围中修改全局范围中的变量,则可以使用` global '关键字。同样,您可以使用“非局部”关键字来关闭范围。

  1. 本地范围:在函数内创建的变量,仅在该函数内访问,并在函数返回或提出任何异常时被删除,即,在编写函数时未处理。
  2. 封闭或非本地范围:在嵌套函数的外部功能中创建的变量,可供内部函数访问。
  3. 全局范围:在' __ -Main __程序中创建的变量,可以在整个程序中访问,最后直到解释器结束。

我希望这可以帮助您获得撰写良好生产级代码的见解,同时遵循与行业相关的最佳实践并减少开发人员定义的例外。但是,这是使我们的程序更加强大的第一步,我们还有更多涵盖。

因此,请继续关注下一篇文章,我们将在其中讨论Python编程语言中的文件序列化和避免!

常见问题

Q1。 Python的名称空间是什么?

Ans。 Python中的名称空间组织和管理程序中的名称或标识符。基本上,它们的作用就像存储映射到其对象的名称的容器或词典一样,例如变量和函数。

Q2。 Python中的LEGB规则是什么?

Ans。 Python中的LegB规则是Python解释器在使用名称或通常称为标识符时抬起头来的顺序。它代表本地,封闭,全球和内置:
1。本地:函数中定义的名称。
2。封闭:任何封闭功能的本地范围(嵌套函数)中的名称。
3。全局:在脚本或模块的顶层定义的名称。
内置:在Python中预定的名称,例如`` print '''或` Len '。

Q3。 python中`global'关键字的用途是什么?

Ans。全局关键字允许函数修改全局范围中定义的变量,并使变量能够驻留在操作之外。注意:仅仅因为您可以做到这一点,并不意味着您应该(经常)使用它,因为这不是一个好的编程实践。

Q4。为什么建议最大程度地减少全局变量的使用?

Ans。过度使用全球变量可能会导致难以理解和维护的程序。这也可能导致意外变化,从而使调试变得更加困难。通常最好使用本地变量并根据需要传递它们。

Q5。嵌套函数中`非局部`关键字的用途是什么?

Ans。与全局关键字相似,Python提供了“非局部”关键字来修改封闭变量。非本地关键字可以修改嵌套函数的封闭函数中定义的变量,从而提供了一种控制嵌套函数中变量范围的方法。

以上是Python名称空间和可变范围的综合指南的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1655
14
CakePHP 教程
1414
52
Laravel 教程
1307
25
PHP教程
1253
29
C# 教程
1227
24
开始使用Meta Llama 3.2 -Analytics Vidhya 开始使用Meta Llama 3.2 -Analytics Vidhya Apr 11, 2025 pm 12:04 PM

Meta的Llama 3.2:多模式和移动AI的飞跃 Meta最近公布了Llama 3.2,这是AI的重大进步,具有强大的视觉功能和针对移动设备优化的轻量级文本模型。 以成功为基础

10个生成AI编码扩展,在VS代码中,您必须探索 10个生成AI编码扩展,在VS代码中,您必须探索 Apr 13, 2025 am 01:14 AM

嘿,编码忍者!您当天计划哪些与编码有关的任务?在您进一步研究此博客之前,我希望您考虑所有与编码相关的困境,这是将其列出的。 完毕? - 让&#8217

AV字节:Meta&#039; llama 3.2,Google的双子座1.5等 AV字节:Meta&#039; llama 3.2,Google的双子座1.5等 Apr 11, 2025 pm 12:01 PM

本周的AI景观:进步,道德考虑和监管辩论的旋风。 OpenAI,Google,Meta和Microsoft等主要参与者已经释放了一系列更新,从开创性的新车型到LE的关键转变

向员工出售AI策略:Shopify首席执行官的宣言 向员工出售AI策略:Shopify首席执行官的宣言 Apr 10, 2025 am 11:19 AM

Shopify首席执行官TobiLütke最近的备忘录大胆地宣布AI对每位员工的基本期望是公司内部的重大文化转变。 这不是短暂的趋势。这是整合到P中的新操作范式

视觉语言模型(VLMS)的综合指南 视觉语言模型(VLMS)的综合指南 Apr 12, 2025 am 11:58 AM

介绍 想象一下,穿过​​美术馆,周围是生动的绘画和雕塑。现在,如果您可以向每一部分提出一个问题并获得有意义的答案,该怎么办?您可能会问:“您在讲什么故事?

GPT-4O vs OpenAI O1:新的Openai模型值得炒作吗? GPT-4O vs OpenAI O1:新的Openai模型值得炒作吗? Apr 13, 2025 am 10:18 AM

介绍 Openai已根据备受期待的“草莓”建筑发布了其新模型。这种称为O1的创新模型增强了推理能力,使其可以通过问题进行思考

如何在SQL中添加列? - 分析Vidhya 如何在SQL中添加列? - 分析Vidhya Apr 17, 2025 am 11:43 AM

SQL的Alter表语句:动态地将列添加到数据库 在数据管理中,SQL的适应性至关重要。 需要即时调整数据库结构吗? Alter表语句是您的解决方案。本指南的详细信息添加了Colu

最新的最佳及时工程技术的年度汇编 最新的最佳及时工程技术的年度汇编 Apr 10, 2025 am 11:22 AM

对于那些可能是我专栏新手的人,我广泛探讨了AI的最新进展,包括体现AI,AI推理,AI中的高科技突破,及时的工程,AI培训,AI,AI RE RE等主题

See all articles