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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
Python对象体系深入分析
Oct 28 Python
Python随机生成信用卡卡号的实现方法
May 14 Python
python如何获取服务器硬件信息
May 11 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
python requests.post带head和body的实例
Jan 02 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
Python操作SQLite/MySQL/LMDB数据库的方法
Nov 07 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
Python如何使用input函数获取输入
Aug 06 Python
如何在windows下安装配置python工具Ulipad
Oct 27 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 PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
全面了解python字符串和字典
2016/07/07 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
Python自带的IDE在哪里
2020/07/01 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
美国零售商店:Blue&Cream
2017/04/07 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
简历的个人自我评价范文
2014/01/03 职场文书
顶撞领导检讨书
2014/01/29 职场文书
小学中秋节活动方案
2014/02/06 职场文书
珍惜水资源建议书
2014/03/12 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
领导班子整改方案
2014/10/25 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python