实例讲解Python中global语句下全局变量的值的修改


Posted in Python onJune 16, 2016

Python的全局变量:int string, list, dic(map) 如果存在global就能够修改它的值。而不管这个global是否是存在于if中,也不管这个if是否能够执行到。
但是,如果没有

if bGlobal: 
    global g_strVal;

int string 将会报错。而list dic(map)是ok的。

#!/usr/bin/dev python 
 
import sys 
import os 
 
g_nVal = 0; 
g_strVal = "aaaa"; 
 
g_map = { 
"aaa" : "111", 
"bbb" : "222", 
"ccc" : "333", 
"ddd" : "444" 
} 
 
g_ls = ['a', 'b', 'c'] 
 
def FixInt(bGlobal = False): 
  if bGlobal: 
    global g_nVal;   
     
  g_nVal = g_nVal + 1; 
   
def FixString(bGlobal = False): 
  if bGlobal: 
    global g_strVal; 
   
  #fix string value 
  g_strVal = g_strVal + 'b'; 
 
def FixMap(bGlobal = False): 
  if bGlobal: 
    global g_map; 
   
  #fix map value   
  g_map['aaa'] = 'aaa__' + g_strVal; 
  g_map['bbb'] = 'bbb__' + g_strVal; 
  g_map['ccc'] = 'ccc__' + g_strVal; 
  g_map['ddd'] = 'ddd__' + g_strVal; 
   
def FixList(bGlobal = False): 
  if bGlobal: 
    global g_ls; 
     
  g_ls.append('1');     
   
def PrintVal(strInfo): 
  if strInfo: 
    print("==== %s =====" %strInfo); 
     
  print("int value:%d" %g_nVal); 
  print("string value:%s" %g_strVal); 
  print("map value:%s" %g_map); 
  print("list value:%s" %g_ls); 
  print("\n\n");   
 
if "__main__" == __name__: 
   
  PrintVal("The orgin vlaue"); 
   
  FixInt(); 
  FixString(); 
  FixMap(); 
  FixList(); 
   
  PrintVal("print all bGlobal = False vlaue"); 
   
  FixInt(True); 
  FixString(True); 
  FixMap(True); 
  FixList(True); 
   
  PrintVal("print all bGlobal = True vlaue");

结果:

==== The orgin vlaue =====
int value:0
string value:aaaa
map value:{'aaa': '111', 'bbb': '222', 'ccc': '333', 'ddd': '444'}
list value:['a', 'b', 'c']

g_nVal src:0
g_nVal dst:1
==== print all bGlobal = False value =====
int value:1
string value:aaaab
map value:{'aaa': 'aaa__aaaab', 'bbb': 'bbb__aaaab', 'ccc': 'ccc__aaaab', 'ddd': 'ddd__aaaab'}
list value:['a', 'b', 'c', '1']

g_nVal src:1
g_nVal dst:2
==== print all bGlobal = True value =====
int value:2
string value:aaaabb
map value:{'aaa': 'aaa__aaaabb', 'bbb': 'bbb__aaaabb', 'ccc': 'ccc__aaaabb', 'ddd': 'ddd__aaaabb'}
list value:['a', 'b', 'c', '1', '1']

为什么修改全局的dict变量不用global关键字
比如下面这段代码

s = 'foo' 
d = {'a':1} 
def f(): 
  s = 'bar' 
  d['b'] = 2 
f() 
print s 
print d

为什么修改字典d的值不用global关键字先声明呢?
这是因为,
在s = 'bar'这句中,它是“有歧义的“,因为它既可以是表示引用全局变量s,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global.
在d['b']=2这句中,它是“明确的”,因为如果把d当作是局部变量的话,它会报KeyError,所以它只能是引用全局的d,故不需要多此一举显式声明global。
上面这两句赋值语句其实是不同的行为,一个是rebinding, 一个是mutation.

但是如果是下面这样

d = {'a':1} 
def f(): 
  d = {} 
  d['b'] = 2 
f() 
print d

在d = {}这句,它是”有歧义的“了,所以它是创建了局部变量d,而不是引用全局变量d,所以d['b']=2也是操作的局部变量。

推而远之,这一切现象的本质就是”它是否是明确的“。
仔细想想,就会发现不止dict不需要global,所有”明确的“东西都不需要global。因为int类型str类型之类的,只有一种修改方法,即x = y, 恰好这种修改方法同时也是创建变量的方法,所以产生了歧义,不知道是要修改还是创建。而dict/list/对象等,可以通过dict['x']=y或list.append()之类的来修改,跟创建变量不冲突,不产生歧义,所以都不用显式global。

Python 相关文章推荐
Python 递归函数详解及实例
Dec 27 Python
python自定义异常实例详解
Jul 11 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
python 的numpy库中的mean()函数用法介绍
Mar 03 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
Python Flask异步发送邮件实现方法解析
Aug 01 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
Python+OpenCV图像处理——图像二值化的实现
Oct 24 Python
python实现登录与注册系统
Nov 30 Python
最大K个数问题的Python版解法总结
Jun 16 #Python
Python中的多行注释文档编写风格汇总
Jun 16 #Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 #Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 #Python
详解Python中 __get__和__getattr__和__getattribute__的区别
Jun 16 #Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 #Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 #Python
You might like
十天学会php之第三天
2006/10/09 PHP
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
SinaEditor使用方法详解
2013/12/28 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&”)
2016/12/23 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
Node.js简单入门前传
2017/08/21 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
Python入门篇之条件、循环
2014/10/17 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python实现简单飞行棋
2020/02/06 Python
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
七年级音乐教学反思
2014/01/26 职场文书
给老师的检讨书
2014/02/11 职场文书
户外活动策划方案
2014/03/12 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
企业团队精神心得体会
2016/01/19 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python
MySQL派生表联表查询实战过程
2022/03/20 MySQL
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python