返回顶部
首页 > 资讯 > 后端开发 > Python >怎么理解python全局变量,局部变量和命名空间
  • 179
分享到

怎么理解python全局变量,局部变量和命名空间

2023-06-22 06:06:31 179人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“怎么理解python全局变量,局部变量和命名空间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 使用全局和局部变

本篇内容介绍了“怎么理解python全局变量,局部变量和命名空间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Python 使用全局和局部变量的方式是特立独行的。虽然在许多或大多数其他编程语言中,如果未另行声明,变量将被视为全局变量,而 Python 则以相反的方式处理变量。如果没有另外声明,它们是本地的。这种方法背后的驱动原因是全局变量通常是不好的做法,应该避免。在大多数情况下,您想使用全局变量,最好使用参数将值放入函数或返回值以将其取出。与许多其他程序结构一样,Python 也通过设计强加了良好的编程习惯。

因此,当您在函数定义中定义变量时,默认情况下它们是该函数的局部变量。也就是说,您对函数体中的此类变量所做的任何操作都不会影响函数外的其他变量,即使它们具有相同的名称。换句话说,函数体是这样一个变量的范围,即这个名称与其值相关联的封闭上下文。

所有变量都有块的作用域,它们在那里被声明和定义。它们只能在声明点之后使用。

简单说一下:变量不必也不能以在 Java 或 C 等编程语言中声明的方式声明。Python 中的变量通过定义它们来隐式声明,即第一次分配值到一个变量,这个变量被声明并自动具有必须分配给它的对象的数据类型。

函数中的全局和局部变量

在下面的示例中,我们想演示如何在函数体内使用全局值:

def  f ():      print ( s )  s  =  “我爱夏天的巴黎!” f ()

输出:

我爱夏天的巴黎!

在调用函数 f() 之前,变量 s 被定义为字符串“我爱夏天的巴黎!”。f() 的主体仅由“print(s)”语句组成。由于没有局部变量 s,即没有赋值给 s,将使用全局变量 s 的值。所以输出将是字符串“我爱夏天的巴黎!”。问题是,如果我们在函数 f() 中改变 s 的值会发生什么?它也会影响全局变量吗?我们在下面的一段代码中对此进行了测试

def  f ():      s  =  "我爱伦敦!"     打印( s ) s  =  “我爱巴黎!”  f ()打印( s )

输出:

我爱伦敦!
我爱巴黎!

如果我们将第一个示例与第二个示例结合起来,即我们首先使用 print() 函数访问 s,希望获得全局值,然后为其分配一个新值呢?给它赋值,意味着 - 正如我们之前所说的 - 创建一个局部变量 s。因此,我们会将 s 作为同一范围内的全局变量和局部变量,即函数体。幸运的是,Python 不允许这种歧义。因此,它会引发错误,正如我们在以下示例中所见:

def  f ():     print ( s )    s  =  “我爱伦敦!”    打印( s )s  =  “我爱巴黎!” f ()

输出:

UnboundLocalError Traceback (最近一次调用最后一次)
<ipython-input-3-d7a23bc83c27> in <module>
5
6 s = “我爱巴黎!”
----> 7 f ( )
<ipython-input-3-d7a23bc83c27> in f ()
1 def f ( ) :
----> 2 print ( s )
3 s = “我
爱伦敦!” 4 打印( s )
5
UnboundLocalError:赋值前引用了局部变量“s”

变量不能在函数内既是局部的又是全局的。由于在 f() 内部为 s 赋值,因此 Python 决定我们需要一个局部变量,因此在 s 定义之前的第一个打印语句抛出了上面的错误信息。任何在函数内部更改或创建的变量都是局部变量,如果它没有被声明为全局变量。要告诉 Python,我们要使用全局变量,我们必须使用关键字“global”明确说明这一点,如下例所示:

def  f ():     global  s     print ( s )     s  =  "只在春天,但伦敦也很棒!"     打印( s )s  =  "我在巴黎找课程!"  f ()打印( s )

输出:

我正在巴黎寻找课程!
只在春天,但伦敦也很棒!
只在春天,但伦敦也很棒!

函数调用完成后,不能从外部访问函数的局部变量。这是上一个例子的延续:

def  f ():     s  =  "我在全球范围内不为人知"    打印( s ) f ()打印( s )

输出:

我在全球不为人知
只在春天,但伦敦也很棒!

以下示例显示了局部和全局变量以及函数参数的狂野组合:

def  foo ( x ,  y ):    全局 a     a  =  42     x , y  =  y , x     b  =  33     b  =  17     c  =  100    打印( a , b , x , y )a ,  b ,  x ,  y  =  1 ,  15 ,  3 , 4  foo ( 17 ,  4 )打印( a ,  b ,  x ,  y )

输出:

42 17 4 17
42 15 3 4

嵌套函数中的全局变量

如果我们在嵌套函数中使用 global 关键字,我们现在将检查会发生什么。以下示例显示了在各种范围内使用变量“city”的情况:

def  f ():     city  =  "Hamburg"     def  g ():         global  city         city  =  "Geneva"     print ( "调用前g:"  +  city )     print ( "现在调用g:" )     g ()     print ( "调用后g: "  + 城市)f () print ( "主城的值:"  +  city )

输出:

之前打电话给g:汉堡
现在调用 g:
打电话后g:汉堡
主要城市价值:日内瓦

我们可以看到嵌套函数 g 中的 global 语句不会影响函数 f 的变量“city”,即它保持其值“Hamburg”。我们还可以从这个例子中推断出,在调用 f() 之后,模块命名空间中存在一个变量 'city',其值为 'Geneva'。这意味着嵌套函数中的 global 关键字不会影响其封闭命名空间的命名空间!这与我们在前一章中发现的一致:在函数内部定义的变量是局部变量,除非它明确标记为全局变量。换句话说,我们可以在任何封闭作用域中引用一个变量名,但我们只能在局部作用域中通过赋值重新绑定变量名,或者通过使用全局声明在模块全局作用域中重新绑定变量名。我们还需要一种方法来访问其他作用域的变量。这样做的方法是非局部定义,我们将在下一章解释。

非局部变量

python3 引入了非局部变量作为一种新的变量。非局部变量与全局变量有很多共同点。与全局变量的一个区别在于,无法通过使用非局部语句来更改模块范围内的变量,即未在函数内部定义的变量。我们在以下两个示例中展示了这一点:

def  f ():    全球 城市    打印( city )city  =  "法兰克福" f ()

输出:

法兰克福

该程序是正确的,并返回“Frankfurt”作为输出。我们将在以下程序中将“全局”更改为“非本地”:

def  f ():    非本地 城市    打印( city )city  =  "法兰克福" f ()

输出:

文件“<ipython-input-9-97bb311dfb80>” ,第2
行 非本地城市
^
语法错误:未找到非本地“城市”的绑定

这表明非局部绑定只能在嵌套函数内部使用。必须在封闭的函数作用域中定义非局部变量。如果变量未在封闭函数作用域中定义,则变量不能在嵌套作用域中定义。这是与“全局”语义的另一个区别。

def  f ():     city  =  "Munich"     def  g ():         nonlocal  city         city  =  "Zurich"     print ( "调用前g:"  +  city )     print ( "现在调用g:" )     g ()     print ( "调用后g: "  + 城市)city  =  "Stuttgart" f () print ( "'city' in main:"  +  city )

输出:

打电话之前 g: 慕尼黑
现在调用 g:
拨打 g 后:苏黎世
主要的“城市”:斯图加特

在前面的例子中,变量 'city' 是在调用 g 之前定义的。如果没有定义,我们会得到一个错误:

高清 ˚F ():    #city = “慕尼黑”    高清 g ^ ():        外地 市        城市 =  “苏黎世”    打印(“呼叫摹前:”  + 城市)    打印(“立即致电G:” )    g ^ ()    打印(“后呼叫 g: "  +  city )city  =  "Stuttgart" f () print ( "'city' in main:"  +  city )

输出:

文件“<ipython-input-11-5417be93b6a6>” ,第4
行 非本地城市
^
语法错误:未找到非本地“城市”的绑定

该程序运行良好 - 如果我们将“非本地”更改为“全局”,在 f - 内有或没有 'city = "Munich"' 行:

def  f ():     #city = "Munich"     def  g ():         global  city         city  =  "Zurich"     print ( "Before call g:"  +  city )     print ( "Calling g now:" )     g ()     print ( "After 调用g:" )呼叫 g: " +  city )city  =  "Stuttgart" f () print ( "'city' in main:"  +  city )

输出:

打电话之前:斯图加特
现在调用 g:
拨打 g 后:苏黎世
主要的“城市”:苏黎世

然而有一个巨大的不同:全局 x 的值现在发生了变化!

“怎么理解python全局变量,局部变量和命名空间”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么理解python全局变量,局部变量和命名空间

本文链接: https://lsjlt.com/news/303144.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么理解python全局变量,局部变量和命名空间
    本篇内容介绍了“怎么理解python全局变量,局部变量和命名空间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 使用全局和局部变...
    99+
    2023-06-22
  • 深入了解python全局变量,局部变量和命名空间
    目录函数中的全局和局部变量嵌套函数中的全局变量非局部变量Python 使用全局和局部变量的方式是特立独行的。虽然在许多或大多数其他编程语言中,如果未另行声明,变量将被视为全局变量,而...
    99+
    2024-04-02
  • mysql全局变量和局部变量
    全局变量和局部变量 在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值)。然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。 举一个例子...
    99+
    2016-04-03
    mysql全局变量和局部变量
  • Python变量教程之全局变量和局部变量
    目录前言全局变量全局关键字前言 全局变量是那些没有在任何函数内部定义并具有全局范围的变量,而局部变量是那些在函数内部定义的变量,其范围仅限于该函数。换句话说,我们可以说局部变量只能在...
    99+
    2024-04-02
  • python基础之局部变量和全局变量
    四种基本的函数类型 局部变量 就是在函数内部定义的变量【作用域仅局限于函数内部】 不同的函数 可以定义相同的局部变量,但是各自用各自的 不会产生影响 局部变量的作用:为了临时...
    99+
    2024-04-02
  • python全局变量和局部变量有什么区别
    Python中的全局变量和局部变量的区别如下:1. 作用域:全局变量在整个程序中都是可见的,可以在任何地方访问。而局部变量只在定义它...
    99+
    2023-08-12
    python
  • python全局变量-局部变量用法和区别
    对于很多初学的同学,对全局和局部变量容易混淆,看看下面给大家的讲解相信都应该明白 两者的区别了。 定义:全局变量:在模块内、在所有函数的外面、在class外面局部变量:在函数内、在class的方法内 下面来看看例子函数内部调用全局变量 a=...
    99+
    2023-01-31
    变量 局部 区别
  • Vue 中怎么实现全局变量和局部变量
    本篇文章为大家展示了Vue 中怎么实现全局变量和局部变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。局组件和局部组件1.先定义组件   Vue...
    99+
    2024-04-02
  • python中全局变量和局部变量有什么区别
    python中全局变量和局部变量有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;...
    99+
    2023-06-14
  • C语言——全局变量和局部变量重名了会怎么样
    前言 (1)今天在交流群里面看到这样一个问题: 为什么这个程序中下面我定义的void型函数smart在全局变量前声明了,但是在man函数中调用了smart函数,m的值打印出来还是0。 #includeint m;void smart(...
    99+
    2023-08-30
    学习 c语言
  • java全局变量和局部变量的区别
    局部变量 (推荐学习:java课程)局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。全局变量全局变量...
    99+
    2021-01-12
    java教程 java
  • java局部变量怎么赋值给全局变量
    在Java中,局部变量是在方法内部定义的变量,它的作用范围仅限于该方法。全局变量是在类的范围内定义的变量,可以被类中的所有方法访问。...
    99+
    2023-10-10
    java
  • Python之全局与局部变量
    ''' 命名空间 : 每次在python解释器启动之后,就会在内存开辟一块内存空间,每当遇到一个变量时,就会在命名空间中,记录下变量名和值之间的关系,也即记录变量对应的值在内存空间中的            地址;当一个函数时,会在命名空间...
    99+
    2023-01-31
    全局 变量 局部
  • Vue全局变量和局部变量如何实现
    这篇文章主要介绍“Vue全局变量和局部变量如何实现”,在日常操作中,相信很多人在Vue全局变量和局部变量如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue全局变量和局部变量如何实现”的疑惑有所帮助!...
    99+
    2023-07-04
  • 从局部变量和全局变量开始全面解析Python中变量的作用域
    理解全局变量和局部变量 1.定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量。在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量。例如: ...
    99+
    2022-06-04
    变量 局部 全局变量
  • Python全局命名空间和局部命名空间有什么区别
    Python中的全局命名空间和局部命名空间都是用来存储变量和函数的地方,但它们之间有一些重要的区别。 全局命名空间是在整个程序中...
    99+
    2024-03-12
    Python
  • Python 专题六 局部变量、全局变量global、导入模块变量
    定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。本文主要讲述全局变量、局部变量和导入模块变量的方法。 参考:《Python核心编程 (第二版)》 一. 局部变量 声明适用的程序的范围...
    99+
    2022-06-04
    变量 局部 模块
  • Golang函数中的变量作用域:局部变量和全局变量
    Golang函数中的局部变量和全局变量,需要具体代码示例 在Golang中,变量的作用域是非常重要的概念。在函数中,我们常常会遇到局部变量和全局变量的情况。这两者在作用域和使用方式上有一些区别,下面我将详细介...
    99+
    2024-01-18
    函数 变量 Golang
  • java中全局变量和局部变量的区别是什么?
    全局变量是编程术语中的一种,源自于变量之分。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。局部变量(Local variables):在方法内部(包括main()方法)定义的变量是局...
    99+
    2021-11-24
    java教程 java 全局变量 局部变量
  • C++ 函数的局部变量和全局变量有什么区别?
    c++++ 局部变量和全局变量的区别:可见性:局部变量仅限于定义函数,而全局变量在整个程序中可见。内存分配:局部变量在栈上分配,而全局变量在全局数据区分配。作用域:局部变量在函数内,而全...
    99+
    2024-04-19
    全局变量 局部变量 c++ 作用域
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作