实例讲解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 29 Python
深入浅析python定时杀进程
Jun 06 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
PyQt5 pyqt多线程操作入门
May 05 Python
Python实现合并两个列表的方法分析
May 28 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 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 miniBB中文乱码问题解决方法
2008/11/25 PHP
preg_match_all使用心得分享
2014/01/31 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
python读取excel表格生成erlang数据
2017/08/26 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
对python中的装包与解包实例详解
2019/08/24 Python
python内置模块collections知识点总结
2019/12/19 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
保安的辞职报告怎么写
2014/01/20 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
监守自盗观后感
2015/06/10 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
MySQL深分页问题解决思路
2022/12/24 MySQL