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 26 Python
python处理文本文件并生成指定格式的文件
Jul 31 Python
讲解Python中fileno()方法的使用
May 24 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
pandas删除指定行详解
Apr 04 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
简单了解Django项目应用创建过程
Jul 06 Python
Python 防止死锁的方法
Jul 29 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
python 实现的车牌识别项目
Jan 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
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
Python制作数据导入导出工具
2015/07/31 Python
Python 类的继承实例详解
2017/03/25 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
python实现俄罗斯方块游戏
2020/03/25 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
小结Python的反射机制
2020/09/28 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
法人委托书
2014/07/31 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
公务员政审材料范文
2014/12/23 职场文书
建议书范文
2015/02/05 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书