实例讲解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中title()方法的使用简介
May 20 Python
Python绘制七段数码管实例代码
Dec 20 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
python进程和线程用法知识点总结
May 28 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
python SQLAlchemy的Mapping与Declarative详解
Jul 04 Python
Django 全局的static和templates的使用详解
Jul 19 Python
numpy 声明空数组详解
Dec 05 Python
Python 中的pygame安装与配置教程详解
Feb 10 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
pandas参数设置的实用小技巧
Aug 23 Python
只用Python就可以制作的简单词云
Jun 07 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自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
javascript 三种编解码方式
2010/02/01 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
js自定义回调函数
2015/12/13 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
Python实现的归并排序算法示例
2017/11/21 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
Python中logging日志库实例详解
2020/02/19 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
英国绿色商店:Natural Collection
2019/05/03 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
老师对学生的评语
2014/04/18 职场文书
入党综合考察材料
2014/06/02 职场文书
建筑节能汇报材料
2014/08/22 职场文书
Java死锁的排查
2022/05/11 Java/Android