实例讲解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编写一个模仿CPU工作的程序
Apr 16 Python
Python对文件操作知识汇总
May 15 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
对python while循环和双重循环的实例详解
Aug 23 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
如何使用repr调试python程序
Feb 28 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 Python
python_tkinter事件类型详情
Mar 20 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 array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
实例讲解PHP表单处理
2019/02/15 PHP
繁简字转换功能
2006/07/19 Javascript
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
jquery中this的使用说明
2010/09/06 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
pyramid配置session的方法教程
2013/11/27 Python
python reduce 函数使用详解
2017/12/05 Python
python画环形图的方法
2020/03/25 Python
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
会计专业自我鉴定
2014/02/10 职场文书
硕士研究生就业推荐信
2014/05/18 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
劳动仲裁调解书
2015/05/20 职场文书