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 从远程服务器下载日志文件的程序
Feb 10 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
一道python走迷宫算法题
Jan 22 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
Feb 11 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
Keras—embedding嵌入层的用法详解
Jun 10 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 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 mssql 日期出现中文字符的解决方法
2009/03/10 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
HTML5有哪些新特征
2015/12/01 HTML / CSS
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
中间件的定义
2016/08/09 面试题
经典优秀个人求职自荐信格式
2013/09/25 职场文书
企业为何需要商业计划书
2013/12/26 职场文书
生日宴会主持词
2014/03/20 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server