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的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
Django中间件实现拦截器的方法
Jun 01 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
Python守护进程实现过程详解
Feb 10 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 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
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
PyQt5显示GIF图片的方法
2019/06/17 Python
python实现银行管理系统
2019/10/25 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
丑小鸭教学反思
2014/02/03 职场文书
期终自我鉴定
2014/02/17 职场文书
毕业生就业意向书
2014/04/01 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
学校安全管理责任书
2014/07/23 职场文书
绿色小区申报材料
2014/08/22 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL