python global关键字的用法详解


Posted in Python onSeptember 05, 2019

最近刚好有朋友遇到个global相关的问题,这里简单学习一下global关键字的用法。

想要更好的了解global关键字,首先要熟悉python的全局变量与局部变量的概念。global关键字的作用是可以申明一个局部变量为全局变量,下面看一下实例

一、变量作用域的说明

这里简单提一下变量作用域的概念,有兴趣的小伙伴,可以查一下相关的博客

1、局部变量

def a():
  ## 菊部变量 - ,-
  local = 1
  print(local)
## 全局无法使用,只有自己可用
print(lobal)

2、全局变量

global_str = '123'
def a():
  ## 全菊变量 - ,-
  print(global_str)
## 全菊变量大家都可以用
print(global_str)

3、内置作用域

系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。这里不介绍了。

4、嵌套作用域

用的也比较少,主要是用在闭包中,看栗子

def out():
  ## 函数内变量,但对于下级函数就是全局变量,对于外部来说就是局部变量
  en = 1
  def inside():
    print(en)
    return en
  return inside()
out()

二、global关键字作用

1、在函数间global关键字的作用

def out():
  ## global关键字作用
  global en
  en = 1
  ## 调用other可以打印en,去掉global会报错。
  other()
  print(out.__globals__)
def other():
  print(en)
out()

2、在类中也是一样,不多说,怕越多越乱,类中可以用self。

3、其他文件导入,如果定义好了之后从其他文件导入了呢?会发生什么,看一下栗子,a文件仍为上面栗子中代码

from report.a import *
out()
print(out.__globals__['en'])

结果:

1
1

还好还好,没有报错。

4、那么问题来了,如果要在另一个文件中继续定义函数,是不是也可以继续使用a文件中的global申明的全局变量呢?

from report.a import out
def b():
  print(out.__globals__['en'])
  ## 直接飙红了。 -,-
  print(en)
b()

果然报错了:

Traceback (most recent call last):
 File "/Users/dangfuli/Documents/PycharmProjects/asp/report/b.py", line 9, in <module>
  b()
 File "/Users/dangfuli/Documents/PycharmProjects/asp/report/b.py", line 6, in b
  print(out.__globals__['en'])
KeyError: 'en'

也就是说,导入包的话,global定义的全局变量没有被加到globals里面。

5、上面好多地方都用到了,func.__globals__,这个运行一下,看个实例

def out():
  ## global关键字作用
  global en
  en = 1
  other()
  print(out.__globals__)
  ## 调用other可以打印en

def other():
  print(en)

out()

## 返回结果
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10306a7b8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/xxx/Documents/PycharmProjects/xxx/report/a.py', '__cached__': None, 'out': <function out at 0x101fcee18>, 'other': <function other at 0x1033f8c80>, 'en': 1}

可以看到,当前的函数用global之后,en变量就被加到了globals里面

下面看看导入到其他地方去的

# a.py
def out():
  ## global关键字作用
  global en
  en = 1
  other()
  print(out.__globals__['en'])
  ## 调用other可以打印en

def other():
  print(en)
#############上面是a文件,下面是b文件#############

# b.py
from report.a import out

def b():
  ## globals里面没有en那个全局变量
  out()
  print(b.__globals__['en'])

b()

看一下结果:

1
Traceback (most recent call last):
 File "/Users/xxx/Documents/PycharmProjects/xxx/report/b.py", line 8, in <module>
  b()
 File "/Users/xxx/Documents/PycharmProjects/xxx/report/b.py", line 6, in b
  print(b.__globals__['en'])
KeyError: 'en'

可以看到,导入的a文件正常运行,b文件打印en的时候就报错了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现系统状态监测和故障转移实例方法
Nov 18 Python
简单谈谈python的反射机制
Jun 28 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
django如何实现视图重定向
Jul 24 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 Python
利用Python实现模拟登录知乎
May 25 Python
python requests证书问题解决
Sep 05 #Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 #Python
Python图像处理模块ndimage用法实例分析
Sep 05 #Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
Sep 05 #Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 #Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 #Python
python实现人工智能Ai抠图功能
Sep 05 #Python
You might like
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
JS 文件传参及处理技巧分析
2010/05/13 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python的正则表达式re模块的常用方法
2013/03/09 Python
python求列表交集的方法汇总
2014/11/10 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
Tensorflow实现酸奶销量预测分析
2019/07/19 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
财务管理职业生涯规划书
2014/02/26 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js