实例讲解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代理抓取并验证使用多线程实现
May 03 Python
Python XML RPC服务器端和客户端实例
Nov 22 Python
Python 通过URL打开图片实例详解
Jun 01 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
python 实现在Excel末尾增加新行
May 02 Python
Python Series从0开始索引的方法
Nov 06 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 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版
2006/10/09 PHP
php.ini 中文版
2006/10/28 PHP
珊瑚虫IP库浅析
2007/02/15 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
python中的decimal类型转换实例详解
2019/06/26 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
海南地接欢迎词
2014/01/14 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
刑事起诉书范文
2015/05/19 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python
MySQL分区表实现按月份归类
2021/11/01 MySQL
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js