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实现提取文章摘要的方法
Apr 21 Python
Python import用法以及与from...import的区别
May 28 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
Python实现购物程序思路及代码
Jul 24 Python
10个Python小技巧你值得拥有
Sep 29 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
对python调用RPC接口的实例详解
Jan 03 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
如何使用python实现模拟鼠标点击
Jan 06 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
python爬取youtube视频的示例代码
Mar 03 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
php数组和链表的区别总结
2019/09/20 PHP
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
python爬取代理ip的示例
2020/12/18 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
大学生简单自荐信
2013/11/10 职场文书
电子商务专业学生的自我鉴定
2013/11/28 职场文书
医大实习自我鉴定
2013/12/07 职场文书
财务会计求职信范文
2015/03/20 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
员工聘用合同范本
2015/09/21 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
Nginx配置Https安全认证的实现
2021/05/26 Servers
Python中字符串对象语法分享
2022/02/24 Python