实例讲解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安装与使用redis的方法
Apr 19 Python
发布你的Python模块详解
Sep 15 Python
PyQt5每天必学之进度条效果
Apr 19 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
使用python判断你是青少年还是老年人
Nov 29 Python
python导入模块交叉引用的方法
Jan 19 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
Python数据持久化存储实现方法分析
Dec 21 Python
python对文件的操作方法汇总
Feb 28 Python
Django models filter筛选条件详解
Mar 16 Python
浅谈anaconda python 版本对应关系
Oct 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
编写PHP的安全策略
2006/10/09 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
清空上传控件input file的值
2010/07/03 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jquery垂直公告滚动实现代码
2013/12/08 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
python 贪心算法的实现
2020/09/18 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
班组长工作职责
2013/12/25 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
单位在职证明书
2014/09/11 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
公司授权委托书范文
2014/09/21 职场文书
2014年除四害工作总结
2014/12/06 职场文书
雷锋之歌观后感
2015/06/10 职场文书
活动简报范文
2015/07/22 职场文书
九不准学习心得体会
2016/01/23 职场文书
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS