今天发现byteOfPython中关于作用域的描述"没有global语句,是不可能为定义在函数外的变量赋值的。"这句只适合标量。因为全局定义的复合变量总是能够在不使用global的情况下在局部作用域访问。为此专门用一个例子来测试各种情况:
# encoding:utf-8
# 局部作用域改变标量,列表或字典(访问元组)
x=50
y=50
aPrg=['ml1bw','cnc','enw']
aPrgCopy=aPrg[:]
tLang=('eng','zh-cn')
d={'m':12,'o':34}
def changeGlobal():
# 标量 无global访问
x=51 # 声明一个新的局部变量,这是这个例子中惟一没有影响对应全局变量的情况
# 如果写成x+=1将引发UnboundLocalError
# 标量 global访问
global y # 先声明操作对象是全局变量
y+=1 # 再改变其值
# 列表 global访问
global aPrgCopy # 或者先像标量一样先声明全局也行
print aPrgCopy
aPrgCopy.extend(['mak','fhj'])
# 列表 无global访问
aPrg.extend(['gwt','hjd']) # 直接对全局列表变量操作就可以!
print '---local:\n',aPrg[0]
# 元组 无global访问
print tLang[0] # 像列表一样直接访问元组元素
# 字典 无global访问
d['m']=32 # 字典也不用声明为全局变量就可以随意操作了!
del d['o']
d['n']=96
print d
print '\n'.join([str(c) for c in ['---global:',x,y,aPrg,aPrgCopy,d]])
changeGlobal()
print '\n'.join([str(c) for c in ['---global:',x,y,aPrg,aPrgCopy,d]])