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使用Tkinter显示网络图片的方法
Apr 24 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
python写一个md5解密器示例
Feb 23 Python
Python获取指定字符前面的所有字符方法
May 02 Python
Python实现输出某区间范围内全部素数的方法
May 02 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
python实践项目之监控当前联网状态详情
May 23 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
python实现扑克牌交互式界面发牌程序
Apr 22 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
python模块与C和C++动态库相互调用实现过程示例
Nov 02 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扩展编写点滴 技巧收集
2010/03/09 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
python测试驱动开发实例
2014/10/08 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
Python实现栈的方法
2015/05/26 Python
python 网络编程常用代码段
2016/08/28 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
Python 图片处理库exifread详解
2021/02/25 Python
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
日语专业个人求职信范文
2014/02/02 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
计划生育诚信协议书
2014/11/02 职场文书
小学教师工作总结2015
2015/04/07 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang