[Python学习] 专题六.局部变量、全局变量global、导入模块变量

2023-11-20

        定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。本文主要讲述全局变量、局部变量和导入模块变量的方法。
        参考:《Python核心编程 (第二版)》

一. 局部变量

        声明适用的程序的范围被称为了声明的作用域。在一个过程中,如果名字在过程的声明之内,它的出现即为过程的局部变量;否则出现即为非局部。例:

def foo(x):
    print 'x = ',x
    x = 200
    print 'Changed in foo(), x = ',x
    
x = 100
foo(x)
print 'x = ',x
        输出结果如下:
>>> 
x =  100
Changed in foo(), x =  200
x =  100
        在主块中定义x=100,Python使用函数声明的形参传递x至foo()函数。foo()中把x赋值为200,x是函数的局部变量;所以在函数内改变x的值,主块中定义的x不受影响。
        核心笔记:
        当搜索一个标识符时,Python先从局部作用域开始搜索。如果在局部作用域内没有找到那个名字,那么一定会在全局域找到这个变量,否则会被抛出NameError异常。
        作用域的概念和用于找到变量的名称空间搜索顺序相关。当一个函数执行时,所有在局部命名空间的名字都在局部作用域内;当查找一个变量时,第一个被搜索的名称空间,如果没有找到那个变量,那么就可能找到同名的局部变量。

二. 全局变量

        全局变量的一个特征是除非删除掉,否则它们存活到脚本运行结束,且对于所有的函数,它们的值都是可以被访问的。然而局部变量,就像它们存放的栈,暂时地存在,仅仅只依赖于定义它们的函数现阶段是否处于活动。当一个函数调用出现时,其局部变量就进入声明它们的作用域。在那一刻,一个新的局部变量名为那个对象创建了,一旦函数完成,框架被释放,变量将会离开作用域。

X = 100
def foo():
    global X
    print 'foo() x = ',X
    X = X + 5
    print 'Changed in foo(), x = ',X

def fun():
    global X
    print 'fun() x = ',X
    X = X + 1
    print 'Changed in fun(), x = ',X
    
if __name__ == '__main__':
    foo()
    fun()
    print 'Result x = ',X
        输出结果如下:
>>> 
foo() x =  100
Changed in foo(), x =  105
fun() x =  105
Changed in fun(), x =  106
Result x =  106
        核心笔记:
        使用global语句定义全局变量。当使用全局变量同名的局部变量时要小心,如果将全局变量的名字声明在一个函数体内,全局变量的名字能被局部变量给覆盖掉。所以,你应该尽量添加global语句,否则会使得程序的读者不清楚这个变量在哪里定义的。
        你可以使用同一个global语句指定多个全局变量。例如global x, y, z。
        当我在制作Python爬虫时,需要想函数中传递url,循环爬取每个url页面的InfoBox,此时的文件写入操作就可以有两种方法实现:1.通过传递参数file;2.通过定义全局变量file。
SOURCE = open("F:\\test.txt",'w')
def writeInfo(i):
    global SOURCE
    SOURCE.write('number'+str(i)+'\n')

def main():
    i=0
    while i<50:
        writeInfo(i)
        print i
        i=i+1
    else:
        print 'End'
    SOURCE.close()

main() 
       PS:在此种用法中,如果我们在函数writeInfo()中不使用global 声明全局变量SOURCE,其实也可以使用,但是此时应该是作为一个内部变量使用,由于没有初始值,因此报错。Python查找变量是顺序是:先局部变量,再全局变量。
UnboundLocalError: local variable 'SOURCE' referenced before assignment

三. 模块导入变量

        主要方法是通过在py文件中模块定义好变量,然后通过import导入全局变量并使用。例:

import global_abc
def foo():
    print global_abc.GLOBAL_A
    print global_abc.GLOBAL_B
    print global_abc.GLOBAL_C
    global_abc.GLOBAL_C = global_abc.GLOBAL_C + 200
    print global_abc.GLOBAL_C
    
if __name__ == '__main__':
    foo()
    print global_abc.GLOBAL_A + ' ' + global_abc.GLOBAL_B
    print global_abc.GLOBAL_C
        输出如下所示,全局变量结构是可以改变的。
>>> 
hello
world
300
500
hello world
500
        截图如下所示:


        PS:应该尽量避免使用全局变量。不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性。对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误。这种错误是很难发现和更正的。同时,全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全局变量降低了代码的可读性,阅读者可能并不知道调用的某个变量是全局变量,但某些情况不可避免的需要使用它。

        最后关于闭包和Lambda(相当于函数)就不再介绍,希望文章对你有所帮助~同时今天也是中秋节,祝所有程序猿和读者中秋节快乐。
 
         (By:Eastmount 2015-9-27 下午4点      http://blog.csdn.net/eastmount/ )


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python学习] 专题六.局部变量、全局变量global、导入模块变量 的相关文章

  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 高效地将大型 Pandas 数据帧写入磁盘

    我正在尝试找到使用 Python Pandas 高效地将大型数据帧 250MB 写入磁盘或从磁盘写入的最佳方法 我已经尝试了所有方法Python 数据分析 但表现却非常令人失望 这是一个更大项目的一部分 该项目探索将我们当前的分析 数据管理
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 打印一份拥有多个家庭的人员名单,每个家庭都有多个电话号码

    我有一类 Person 它可以有多个 Home 每个 Home 都有一个或多个电话号码 我已经定义了类 但现在我正在尝试创建一个视图 其中列出每个人的所有家庭以及每个家庭地址的所有电话号码 类似于 john smith 123 fake s
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • 同一台机器上有多个Python版本?

    Python 网站上是否有关于如何在 Linux 上的同一台计算机上安装和运行多个版本的 Python 的官方文档 我可以找到无数的博客文章和答案 但我想知道是否有 标准 官方方法可以做到这一点 或者这一切都取决于操作系统 我认为它是完全独
  • Bokeh 中单独的节点和边缘悬停工具?

    我正在尝试为 Bokeh 中的节点和边缘获取单独的悬停工具提示 但未能使其正常工作 有人可以指出我做错了什么吗 我相信代码应该如下所示 from bokeh io import show output notebook from bokeh
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 导入目录下的所有模块

    有没有办法导入当前目录中的所有模块 并返回它们的列表 例如 对于包含以下内容的目录 mod py mod2 py mod3 py 它会给你
  • 预测测试图像时出现错误 - 无法重塑大小数组

    我正在尝试使用 TensorFlow 和 Keras 在 Python 中进行图像识别 并且我已经关注了下面的博客 https stackabuse com image recognition in python with tensorfl
  • 我可以在 if 语句中使用“as”机制吗

    是否可以使用as in if类似的声明with我们使用的 例如 with open tmp foo r as ofile do something with ofile 这是我的代码 def my list rtrn lst True if
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 异步异常处理程序:在事件循环线程停止之前不会被调用

    我正在我的异步事件循环上设置异常处理程序 但是 在事件循环线程停止之前 它似乎不会被调用 例如 考虑以下代码 def exception handler loop context print Exception handler called
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 用 Beautiful Soup 进行抓取:为什么 get_text 方法不返回该元素的文本?

    最近我一直在用 python 开发一个项目 其中涉及抓取一些网站的一些代理 我遇到的问题是 当我尝试抓取某个知名代理站点时 当我要求 Beautiful Soup 查找 IP 在代理表中的位置时 它并没有按照我的预期执行操作 我将尝试查找每

随机推荐

  • Public Private Protect Inheritance and access specifiers

    In the previous lessons on inheritance we ve been making all of our data members public in order to simplify the example
  • 腾讯云函数的Python依赖库打包注意事项

    云函数Python3 6依赖库 官网文档链接 前两天写了一个Python程序要用pycryptodome库 但是腾讯云函数并没有自带这个库 感觉还是记录一下比较好 要使用CentOS 7下的Python Python版本要是3 6的 我一开
  • VIM选择文本块/复制/粘贴

    在正常模式下 按ESC进入 按键v进入可视化模式 然后按键盘左右键或h l键即可实现文本的选择 其它相关命令 v 按字符选择 经常使用的模式 所以亲自尝试一下它 V 按行选择 这在你想拷贝或者移动很多行的文本的时候特别有用 CTRL v 按
  • QT中修改QCalendarWidget样式时,令周几(表头)与日期文字颜色不同的方法,设置文字样式冲突的问题

    太长不看版 Qt日历中使用setWeekdayTextFormat修改周末文字颜色和setHeaderTextFormat修改表头文字颜色发生冲突 通过找到每个周末日期来修改文字颜色 效果图和代码见文末 在Qt中用到了QCalendarWi
  • Prometheus Blackbox Exporter 的 HTTP 探测指标中各个阶段的时间统计信息

    在 Prometheus Blackbox Exporter 的 HTTP 探测指标中 probe http duration seconds 指标包含各个阶段的时间统计信息 这些阶段代表了 HTTP 探测的不同阶段和指标 以下是各个阶段的
  • 同步时间

    系统时间与硬件时间 一台计算机有两个时钟 一是硬件时间时钟 RTC Real Time Clock 又实时时钟 二是系统时钟 System Clock 1 概念 硬件时钟是嵌在主板上的特殊电路 平时关机后还可计算时间 系统时钟是操作系统的k
  • 安装tensorflow version `CXXABI_1.3.7' not found

    现象 ImportError usr lib64 libstdc so 6 version CXXABI 1 3 7 not found required by root anaconda3 lib python3 6 site ntern
  • mybatis+oracle+map入参,并获取主键ID的返回值

    insert id insert parameterType map useGeneratedKeys true keyProperty id gt insert into person name pswd values name pswd
  • 第五章 Gateway--服务网关

    接上一篇文章开始网关之旅 首先告诉大家网关是什么 Gateway简介 怎么配置 怎么入门 执行流程等等相关介绍 第一章 微服务的架构介绍发展第二章 微服务环境搭建第三章 Nacos Discovery 服务治理第四章 Sentinel 服务
  • 基于深度学习的关系抽取综述

    论文 https arxiv org pdf 1705 03645 pdf 一 介绍 信息抽取是NLP的一个基本任务 从非结构化文本中抽取机器或程序能够理解的结构化知识 信息抽取包括以下子任务 NER 关系抽取 事件抽取等等 本文中 我们着
  • Java list判空

    if null list list size 0 list isEmpty 和list size 0 没有区别 isEmpty 判断有没有元素 而size 返回有几个元素 如果判断一个集合有无元素 建议用isEmpty 方法 这清晰 简明
  • 0基础,自学3个月转行软件测试,从月薪3k到12k我整理的超全学习指南

    大家好我是小娜 现在是一名软件测试测试工程师 工资在1w2阶段还需努力 我大学期间学的是电气工程及其自动化专业 可以说是一事无成哈哈 大学三天打鱼 两天筛网导致专业水平学的不怎么样 毕业后从事了一份销售 买房子 的工作 但是 销售工作压力大
  • GIT代码仓库迁移

    GIT代码仓库迁移 保留原有的提交记录 查看原有提交路径 git remote v 变更为新的提交路径 git remote set url origin 新路径 拉取新路径下的内容 允许不相关历史提交 并强制合并 git pull ori
  • 亲密关系沟通-【正向情绪】创造一场愉快的沟通体验

    为什么有的时候聊天越聊越开心 有时候却让你意兴阑珊 正向情绪体验 积极议题 充分发挥 谁都喜欢被看见 让他不断得到关注 得到你持续的关注 你知道吗 我这个月业绩第一 哇 你超棒的 哪里哪里 话题聊不下去 你给他夸奖 他只能谦虚 天哪你怎么做
  • [转]使用Midjourney命令输出稳定的漫画角色

    转载自 用对Midjourney命令你也可以输出稳定的漫画角色 qq com 昨天的文章已经教会了大家如何成为15分钟快速制作一幅小漫画 有兴趣的可以翻阅上一篇文章 但是不少同学会发现 Midjourney的随机性比较强 即使输入相同的命令
  • 转载:《七周成为数据分析师》

    百日计划第一周总结 1 计划 1 彻底结束之前预定暑假完成的天善学院课程 七周数据分析师 2 总结 七周数据分析师 2 完成情况 1 完成 七周成为数据分析师 任务 2 周总结与 七周数据分析师 一起完成 七周数据分析师 总结 第一周 数据
  • 【Python零基础入门篇 · 17】:模块、模块的使用、过滤执行代码写法、包的使用

    文章目录 模块 内置模块 第三方模块 自定义模块 模块的使用 import 模块名 导入自定义模块 from import 模块起别名 as 导入多模块 模块 模块 就是 py文件 里面定义了一些函数和变量 需要的时候就可以导入这些模块 执
  • 零基础Java详细的jdk的下载以及安装配置

    文章目录 一 下载jdk 二 配置jdk 三 查看配置是否成功 一 下载jdk 1 登录oracle官网 2 3 4 点进去往下拉 会有jdk新版本 接受许可协议 直接下载 zip压缩文档就行 也可以直接下载 exe安装版本 5 找到压缩包
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • [Python学习] 专题六.局部变量、全局变量global、导入模块变量

    定义在函数内的变量有局部作用域 在一个模块中最高级别的变量有全局作用域 本文主要讲述全局变量 局部变量和导入模块变量的方法 参考 Python核心编程 第二版 一 局部变量 声明适用的程序的范围被称为了声明的作用域 在一个过程中 如果名字在