实例讲解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中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
Python中运行并行任务技巧
Feb 26 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
python3实现网页版raspberry pi(树莓派)小车控制
Feb 12 Python
Python @property及getter setter原理详解
Mar 31 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 Python
python三子棋游戏
May 04 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
Yii中render和renderPartial的区别
2014/09/03 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
CI框架常用方法小结
2016/05/17 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
jquery indexOf使用方法
2013/08/19 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
关于Vue.js一些问题和思考学习笔记(2)
2016/12/02 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
python实现的简单抽奖系统实例
2015/05/22 Python
Python处理Excel文件实例代码
2017/06/20 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
python处理数据,存进hive表的方法
2018/07/04 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
医学生职业规划范文
2014/01/05 职场文书
学生实习介绍信
2014/01/15 职场文书
公司委托书格式范文
2014/04/04 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
vue ref如何获取子组件属性值
2022/03/31 Vue.js