新闻详情

新闻详情

首页 / 资讯中心 / 详情

深入了解python全局变量,局部变量和命名空间

发布时间:2026/9/12 21:25:22来源:尧图网络
深入了解python全局变量,局部变量和命名空间
所以, 要是您于函数定义里定义变量, 在默认情形下它们属于该函数的局部变量。这意味着, 您针对函数体里的这类变量所开展的任何行为, 都不会对函数外的其他变量产生影响, 哪怕它们有着相同的名称。换句话讲, 函数体是这样一种变量的区间, 就是该名称与其值相联系的封闭环境。变量的特点是, 所有变量都存在块的作用域, 在该作用域里变量被声明, 同时被定义, 变量的使用规则是, 只能在声明点之后使用。简而言之: 变量没必要且不可以用在诸如Java、C等编程语言里声明的那种方式去声明。其中的变量借助定义它们来进行隐式声明, 也就是说, 当首次给一个变量赋值时, 这个变量就被声明了, 并且会自动拥有必须赋予它的对象的数据类型。要是您在理解这一点上碰到问题, 那就去查阅我们有关数据类型和变量的章节, 去查看左侧的链接。函数中的全局和局部变量在下面的示例中我们想演示如何在函数体内使用全局值def f (): print ( s ) s “我爱夏天的巴黎” f ()输出我爱夏天的巴黎变量 s 被定义成字符串“我爱夏天的巴黎”之时, 比在调用函数 f() 之前, f() 的主体仅仅是由“print(s)”语句所构成, 因为不存在对应赋给 s 的局部变量 s, 故而会用上全局变量 s 的值, 于是输出将会是字符串“我爱夏天的巴黎”, 问题在于, 要是我们于函数 f() 里对 s 的值作出改变, 那会出现什么情况, 它又是否会对全局变量产生影响, 我们于下面的一段代码当中针对此进行了相应的测试:def f (): s 我爱伦敦 打印( s ) s “我爱巴黎” f () 打印( s )输出我爱伦敦我爱巴黎要是我们把第一个示例跟第二个示例合并起来, 也就是我们先运用print()函数去访问s, 期望得到全局值, 接着给它赋予一个新值怎样呢? 给它赋值, 这指的是 - 就像我们之前提到的 - 去创建一个局部变量s。所以, 我们会把s当作同一范围内的全局变量以及局部变量, 也就是函数体。幸运的是, 不允许存在这种歧义。因而, 它会引发错误, 就如同我们在下面的示例中所看到的:def f (): print ( s ) s “我爱伦敦” 打印( s ) s “我爱巴黎” f ()输出(最近一次调用最后一次)in6 s “我爱巴黎”---- 7 f ( )in f ()1 def f ( ) :---- 2 print ( s )3 s “我爱伦敦” 4 打印( s )赋值前引用了局部变量“s”变量没办法在函数之内, 同时具备局部的以及全局的特性。鉴于在f()内部针对s进行了赋值操作, 所以, 我们因此判定需要一个局部变量, 故而在s定义前的头一个打印语句, 抛出了上面所讲到的错误信息。任何于函数内部被更改或者创建的变量, 倘若它未曾被声明为全局性变量, 便是局部变量。若要告知其我们打算使用全局变量, 那我们必须运用关键字“”清晰地表明这一点, 就如同下面这个例子所呈现的那样: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 1742 15 3 4嵌套函数中的全局变量要是我们于嵌套函数当中运用关键字, 此刻我们就要去核查会出现啥情况。下面这个示例展现了在各类范围里运用变量“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里的语句, 不会对函数f的变量“city”产生影响, 也即是它会维持其值为“”。我们同样能够从这一例子当中推导得出, 在对f()进行调用之后, 模块命名空间里存在着一个变量city, 它的值是。这表明嵌套函数中的关键字, 不会对其封闭命名空间的命名空间造成影响这跟我们在前一章里所发现的情况相契合: 在函数内部被定义的变量属于局部变量, 除非它被明确标记成全局变量。换一种说法来讲, 我们能够在任意封闭作用域里引用一个变量名, 然而我们可在局部作用域里, 唯有通过赋值去重新绑定变量名, 或者借助使用全局声明于模块全局作用域中重新绑定变量名。我们也还需要一种途径来访问其他作用域的变量。而这样做的办法是采用非局部定义, 我们会在下一章予以解释。非局部变量有一种新变量被引入了, 它是非局部变量。非局部变量跟全局变量有着诸多相同点。不过, 和全局变量存在一个差异, 那就是在模块范围内, 也就是未于函数内部定义的变量, 没办法借助非局部语句去更改它。在下面这两个示例里, 我们把这一点展示出来了:def f () 全球 城市 打印( city ) city 法兰克福 f ()输出法兰克福这个程序是对的, 会返回空字符串当作输出。接下来的程序里, 我们要把“全局”改成“非本地”:def f (): 非本地 城市 打印( city ) city 法兰克福 f ()输出文件“” 第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 )输出文件“”第4行 非本地城市语法错误未找到非本地“城市”的绑定这个程序运行得挺不错, 要是我们把“非本地”换成“全局”, 在f里面, 不管有没有 city 这一行时: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 的值现在发生了变化
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

YOLO行人检测训练实战:基于2859张人数据集的数据处理与优化 2026/9/12 22:19:30

YOLO行人检测训练实战:基于2859张人数据集的数据处理与优化

简介:这是一份面向YOLO系列目标检测算法训练与验证的人体数据集资源,带标签图像规模为2859张,适合需要现成标注数据的计算机视觉学习者和开发者。压缩包约185.64MB,共2000个文件,文件明细以VOC格式的xml标签为主&#…

阅读更多 →
基于Storm+Esper的异常交易监控架构实践 2026/9/12 22:19:30

基于Storm+Esper的异常交易监控架构实践

简介:面向金融实时风控与大数据流计算学习者,这份完整项目包以Storm与Esper架构为核心,研发证券异常交易行为监控系统,重点支持金证交易系统指令的拦截、复制与解析。压缩包共45个文件,包含24个Java源码文件、8张运行截…

阅读更多 →
电商数据分析工具选型与应用指南 2026/9/12 22:19:30

电商数据分析工具选型与应用指南

1. 电商数据分析工具概述在电商行业蓬勃发展的今天,数据分析已成为企业决策的核心支撑。作为从业十年的电商老兵,我深刻体会到优质数据分析工具对业务增长的巨大价值。电商数据分析工具是指专门用于收集、处理、分析和可视化电商平台各类运营数据的软件系…

阅读更多 →
wezterm.config_file:获取当前生效配置文件的绝对路径——原理、用法与实战场景 2026/9/12 22:19:30

wezterm.config_file:获取当前生效配置文件的绝对路径——原理、用法与实战场景

wezterm.config_file:获取当前生效配置文件的绝对路径——原理、用法与实战场景 【免费下载链接】wezterm A GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust 项目地址: https://gitcode.com/GitHub_T…

阅读更多 →
开源多模态模型的4K能力边界与真实可用性解析 2026/9/12 22:19:30

开源多模态模型的4K能力边界与真实可用性解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Sensirion I2C SCD30 驱动库版本演进与 Tasmota 集成实战指南 2026/9/12 22:16:29

Sensirion I2C SCD30 驱动库版本演进与 Tasmota 集成实战指南

Sensirion I2C SCD30 驱动库版本演进与 Tasmota 集成实战指南 【免费下载链接】Tasmota Alternative firmware for ESP8266 and ESP32 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞