实例讲解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与php实现分割文件代码
Mar 06 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
Python netmiko模块的使用
Feb 14 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
Python实现计算图像RGB均值方式
Jun 04 Python
Python中bisect的用法及示例详解
Jul 20 Python
python模块内置属性概念及实例
Feb 18 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 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 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
jQuery.extend 函数详解
2012/02/03 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
jquery实现拖动效果
2016/08/10 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
通信专业个人自我鉴定
2013/10/21 职场文书
体育老师的教学自我评价分享
2013/11/19 职场文书
同事吵架检讨书
2014/02/05 职场文书
同学会主持词
2014/03/18 职场文书
岗位廉政承诺书
2014/03/27 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
大学生年度个人总结
2015/02/15 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers