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的re模块应用实例
Sep 26 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
python实现比较两段文本不同之处的方法
May 30 Python
Python抓取百度查询结果的方法
Jul 08 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
python进程间通信Queue工作过程详解
Nov 01 Python
python实现简单坦克大战
Mar 27 Python
django models里数据表插入数据id自增操作
Jul 15 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计算title标题相似比的方法
2015/07/29 PHP
PHP5.3新特性小结
2016/02/14 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
python之pexpect实现自动交互的例子
2019/07/25 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
python enumerate内置函数用法总结
2020/01/07 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
信用社竞聘演讲稿
2014/05/16 职场文书
财务负责人任命书
2014/06/06 职场文书
募捐感谢信
2015/01/22 职场文书
银行稽核岗位职责
2015/04/13 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
表扬信范文
2019/04/22 职场文书