Python语法测试:各种全局变量类型的局部作用域访问方式


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