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之不要红头文件(1)
Sep 28 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
TensorFlow实现简单卷积神经网络
May 24 Python
python中pip的安装与使用教程
Aug 10 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
Python实现随机生成任意数量车牌号
Jan 21 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
Python尾递归优化实现代码及原理详解
Oct 09 Python
Python基础知识之变量的详解
Apr 14 Python
详解Django中 render() 函数的使用方法
Apr 22 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/10/29 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
让焦点自动跳转
2006/07/01 Javascript
js的一些常用方法小结
2011/06/29 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
js实现自定义路由
2017/02/04 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
JS实现简易日历效果
2021/01/25 Javascript
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
python实现发送邮件
2021/03/02 Python
《再见了,亲人》教学反思
2014/02/26 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
PyTorch的Debug指南
2021/05/07 Python