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中对list去重的多种方法
Sep 18 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
使用python绘制常用的图表
Aug 27 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
python3发送邮件需要经过代理服务器的示例代码
Jul 25 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
Python各种扩展名区别点整理
Feb 27 Python
Python内置异常类型全面汇总
May 28 Python
python代码实现扫码关注公众号登录的实战
Nov 01 Python
Python采集股票数据并制作可视化柱状图
Apr 04 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
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
深入理解Python 代码优化详解
2014/10/27 Python
浅析Python多线程下的变量问题
2015/04/28 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
Python 数据结构之旋转链表
2017/02/25 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
python编写计算器功能
2019/10/25 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
自荐信封面
2013/12/04 职场文书
主治医师岗位职责
2013/12/10 职场文书
物业工作计划书
2014/01/10 职场文书
班级聚会策划书
2014/01/16 职场文书
社区工作者先进事迹
2014/01/18 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
品酒会策划方案
2014/05/26 职场文书
关于保护环境的建议书
2014/08/26 职场文书
食品质检员岗位职责
2015/04/08 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
商业计划书范文
2019/04/24 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
部分武汉产收音机展览
2022/04/07 无线电