实例讲解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的id()函数介绍
Feb 10 Python
Python时间戳与时间字符串互相转换实例代码
Nov 28 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
Jul 25 Python
python框架flask表单实现详解
Nov 04 Python
python__new__内置静态方法使用解析
Jan 07 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 Python
Python使用tkinter实现小时钟效果
Feb 22 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使之能同时支持GIF和JPEG
2006/10/09 PHP
PHP学习笔记之二
2011/01/17 PHP
php中使用url传递数组的方法
2015/02/11 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
PHP支付宝当面付2.0代码
2018/12/21 PHP
php解决安全问题的方法实例
2019/09/19 PHP
javascript 日期时间 转换的方法
2013/02/21 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
python实现的简单FTP上传下载文件实例
2015/06/30 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python正则简单实例分析
2017/03/21 Python
Python文件和流(实例讲解)
2017/09/12 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
汽修专业自荐信
2014/07/07 职场文书
解放思想演讲稿
2014/09/11 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
创业计划书之废品回收
2019/09/26 职场文书
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技
HTML中的表单元素介绍
2022/02/28 HTML / CSS