实例讲解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开发中要注意的十个小贴士
Aug 30 Python
Python爬虫代理IP池实现方法
Jan 05 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
Python Grid使用和布局详解
Jun 30 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
使用numba对Python运算加速的方法
Oct 15 Python
python list格式数据excel导出方法
Oct 31 Python
django foreignkey(外键)的实现
Jul 29 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
Python绘图实现台风路径可视化代码实例
Oct 23 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/11/25 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
javascript处理table表格的代码
2010/12/06 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
Angular 多模块项目构建过程
2020/02/13 Javascript
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
跟老齐学Python之永远强大的函数
2014/09/14 Python
Python调用C++程序的方法详解
2017/01/24 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
最新pycharm安装教程
2020/11/18 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
复古服装:RetroStage
2019/05/10 全球购物
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
八项规定整改措施
2014/02/12 职场文书
海飞丝广告词
2014/03/20 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
授权委托书公证
2014/09/14 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS