实例讲解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实现进程间通信简单实例
Jul 23 Python
python在Windows8下获取本机ip地址的方法
Mar 14 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
redis之django-redis的简单缓存使用
Jun 07 Python
python3.6编写的单元测试示例
Aug 17 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
python手机号前7位归属地爬虫代码实例
Mar 31 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
python安装第三方库如xlrd的方法
Oct 31 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
python scrapy简单模拟登录的代码分析
Jul 21 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 文件上传全攻略
2010/04/28 PHP
php验证码实现代码(3种)
2015/09/07 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
jquery attr 设定src中含有&(宏)符号问题的解决方法
2011/07/26 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
js实现点击烟花特效
2020/10/14 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
详细解析Python中的变量的数据类型
2015/05/13 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
python中的变量如何开辟内存
2018/06/26 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
办公室综合文员岗位职责范本
2014/02/13 职场文书
考核评语大全
2014/04/29 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
关于工作经历的证明书
2014/10/11 职场文书
超市督导岗位职责
2015/04/10 职场文书
承诺书范本大全
2015/05/04 职场文书
单位接收证明格式
2015/06/18 职场文书
高老头读书笔记
2015/06/30 职场文书
董事长秘书工作总结
2015/08/14 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书