Python中全局变量的引用与修改

观察下面的代码及执行结果:

import pandas as pd
a=1
b=[2,3]
def modi1():
    a=101
    b=[4,5]
    print(a,b)
 
def modi2():
    b[0]=6
    print(a,b)
 
def modi3():
    global a
    a=101
    print(a,b)
 
print(a,b)
print('----------------------on-modi1-----------------------')
modi1()
print('-------------------------modi1-----------------------')
print(a,b)
print('----------------------on-modi2------------------------')
modi2()
print('-------------------------modi2------------------------')
print(a,b)
print('----------------------on-modi3-------------------------')
modi3()
print('-------------------------modi3-------------------------')
print(a,b)

结果:

1 [2, 3]
----------------------on-modi1-----------------------
101 [4, 5]
-------------------------modi1-----------------------
1 [2, 3]
----------------------on-modi2------------------------
1 [6, 3]
-------------------------modi2------------------------
1 [6, 3]
----------------------on-modi3-------------------------
101 [6, 3]
-------------------------modi3-------------------------
101 [6, 3]

对上面结果的分析:

函数modi1()中重新定义了一个变量 a 和变量b,这样 a和b 都是局部变量,与外面的全局变量没有关系,所以函数结束后全局变量 a 和全局变量b的值没有改变。

函数modi2()中引用了外面的全局变量b,对全局变量b的修改,函数结束后全局变量b发生的改变。

函数modi3()中声明变量a为全局变量a,函数中对变量a的修改即是对全局变量a的修改,函数结束后全局变量a发生的改变。

变量a和变量b的差异的原因:格式是否引发歧义。容器类型的数据如列表、字典、数据框等,他们的修改和创建书写格式全然不同,不会引发格式歧义;而数字、字符串类型的变量,他们定义和修改都是用 =? 链接,引发了格式上的歧义,所以,当Python解释器遇到函数中的 “a = 101”这种格式时,不知道是 “引用全局变量a修改为101” 还是 “定义一个等于 101 的局部变量” ,从而引发歧义,为了确保全局变量对代码其他部分产生更小的影响,Python默认为第二种??重新定义一个变量,来避免修改全局变量对整体代码产生其他未知影响。

综上所述:

本质:格式引发的歧义问题

运用:对于列表、字典、数据框等不会因为格式问题引发歧义的;对于数字、字符串来说,当引用与创建发生歧义时,Python解释器默认创建新的变量,若不想创建,只是想修改全局变量,需要加global声明。

Follow me!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注