实例讲解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 相关文章推荐
VSCode下配置python调试运行环境的方法
Apr 06 Python
浅谈numpy数组中冒号和负号的含义
Apr 18 Python
django2.0扩展用户字段示例
Feb 13 Python
PyQt5实现简易计算器
May 30 Python
python里运用私有属性和方法总结
Jul 08 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
Python实现区域填充的示例代码
Feb 03 Python
python单元测试之pytest的使用
Jun 07 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 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中CI操作多个数据库的代码
2012/07/05 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
js表单验证实例讲解
2016/03/31 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
新闻学专业应届生求职信
2013/11/08 职场文书
大学新生欢迎词
2014/01/10 职场文书
孝老爱亲模范事迹
2014/01/24 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
12月红领巾广播稿
2014/02/13 职场文书
运动会口号16字
2014/06/07 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
mysql联合索引的使用规则
2021/06/23 MySQL
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
Java 多线程协作作业之信号同步
2022/05/11 Java/Android