实例讲解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使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 Python
Python中Threading用法详解
Dec 27 Python
Python使用pip安装pySerial串口通讯模块
Apr 20 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
python实现连连看游戏
Feb 14 Python
python实现手势识别的示例(入门)
Apr 15 Python
Python pip install之SSL异常处理操作
Sep 03 Python
详解python内置模块urllib
Sep 09 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php通用防注入程序 推荐
2011/02/26 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
PHP错误处理函数
2016/04/03 PHP
Laravel实现表单提交
2017/05/07 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
javascript时区函数介绍
2012/09/14 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
基于Three.js实现360度全景图片
2018/12/30 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
Python版微信红包分配算法
2015/05/04 Python
Apache如何部署django项目
2017/05/21 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
python框架flask表单实现详解
2019/11/04 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
优秀的毕业生的自我评价
2013/12/12 职场文书
大学生实训报告总结
2014/11/05 职场文书
实习工作表现评语
2014/12/31 职场文书
黄山导游词
2015/01/31 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
作弊检讨书范文
2015/05/06 职场文书
红色经典电影观后感
2015/06/18 职场文书
高二语文教学反思
2016/02/16 职场文书
python单元测试之pytest的使用
2021/06/07 Python