实例讲解Python中global语句下全局变量的值的修改

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。

(0)

相关推荐

  • 探究Python多进程编程下线程之间变量的共享问题

     1.问题: 群中有同学贴了如下一段代码,问为何 list 最后打印的是空值? from multiprocessing import Process, Manager import os manager = Manager() vip_list = [] #vip_list = manager.list() def testFunc(cc): vip_list.append(cc) print 'process id:', os.getpid() if __name__ == '__main_

  • 从局部变量和全局变量开始全面解析Python中变量的作用域

    理解全局变量和局部变量 1.定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量.例如: num = 100 def func(): num = 123 print num func() 输出结果是123.说明函数中定义的变量名num是一个局部变量,覆盖全局变量.再例如: num = 100 def func(): num += 100 print num func() 输出结果是:Unb

  • 详解Python中的变量及其命名和打印

    在程序中,变量就是一个名称,让我们更加方便记忆. cars = 100 space_in_a_car = 4.0 drivers = 30 passengers = 90 cars_not_driven = cars - drivers cars_driven = drivers carpool_capacity = cars_driven * space_in_a_car average_passengers_per_car = passengers / cars_driven print "

  • python实现同时给多个变量赋值的方法

    本文实例讲述了python实现同时给多个变量赋值的方法.分享给大家供大家参考.具体分析如下: python中可以同时给多个变量赋值,下面列举了三种方法 # Assign values directly a, b = 0, 1 assert a == 0 assert b == 1 # Assign values from a list (r,g,b) = ["Red","Green","Blue"] assert r == "Red&q

  • 深入理解Python变量与常量

    变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中.常量是一块只读的内存区域,常量一旦被初始化就不能被改变. 变量命名字母.数字.下划线组成,不能以数字开头,前文有说不在赘述. 变量赋值 Python中的变量不需要声明,变量的赋值操作即是变量的声明和定义的过程.每个变量在内存中创建都包括变量的标识.名称.和数据这些信息. Python中一次新的赋值,将创建一个新的变量.即使变量的名称相同,变量的标识

  • Python环境变量设置方法

    Alias Maya中的脚本语言是Mel 和 Python,据说Houdini未来也会把Python作为主要的脚本语言,作为影视特效师,掌握Python语言是必备技能:虽然Maya内置了Python运行时,但是,如果要系统学习Python语言,环境变量还是需要配置一下~ 默认情况下,在windows下安装python之后,系统不会自动添加相应的环境变量.此时在命令行输入python命令是不能执行的,配置方法如下: 1. 首先需要在系统中注册python环境变量:假设python的安装路径为c:\

  • python中的实例方法、静态方法、类方法、类变量和实例变量浅析

    注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: 复制代码 代码如下: class Foo:    def __init__(self, name):        self.name = name    def hi(self):        print self.name if __name__ == '__main__':    foo01 = Foo('letian')    foo01.hi()    print type(Foo)    p

  • Python 专题六 局部变量、全局变量global、导入模块变量

    定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域.本文主要讲述全局变量.局部变量和导入模块变量的方法. 参考:<Python核心编程 (第二版)> 一. 局部变量 声明适用的程序的范围被称为了声明的作用域.在一个过程中,如果名字在过程的声明之内,它的出现即为过程的局部变量:否则出现即为非局部.例: def foo(x): print 'x = ',x x = 200 print 'Changed in foo(), x = ',x x = 100 foo(x) print

  • python中查看变量内存地址的方法

    本文实例讲述了python中查看变量内存地址的方法.分享给大家供大家参考.具体实现方法如下: 这里可以使用id >>> print id.__doc__ id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address

  • python和shell变量互相传递的几种方法

    python -> shell: 1.环境变量 复制代码 代码如下: import os  var=123或var='123'os.environ['var']=str(var)  #environ的键值必须是字符串   os.system('echo $var') 复制代码 代码如下: import os  var=123或var='123'os.environ['var']=str(var)  #environ的键值必须是字符串  os.system('echo $var') 2.字符串连接

随机推荐