实例讲解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中的上下文管理器
Jun 28 Python
浅析使用Python操作文件
Jul 31 Python
教你用Python创建微信聊天机器人
Mar 31 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Python零基础入门学习之输入与输出
Apr 03 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
pytest中文文档之编写断言
Sep 12 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
Pytorch 高效使用GPU的操作
Jun 27 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操作数组相关函数
2011/02/03 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
vue mounted组件的使用
2018/06/18 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
Python脚本实现下载合并SAE日志
2015/02/10 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
JBL英国官网:JBL UK
2018/07/04 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
酒吧创业计划书
2014/01/18 职场文书
战友聚会邀请函
2014/01/18 职场文书
商场租赁意向书
2014/07/30 职场文书
工作检讨书500字
2014/10/19 职场文书
华清池导游词
2015/02/02 职场文书
奖励申请报告范文
2015/05/15 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS