先来看下面的代码及执行结果:函数
a = 1 b = [2,3] def nums(): a = 2 b[0] = 0 print(a) print(b) print(a) print(b) nums() print(a) print(b)
结果:spa
1 [2, 3] 2 [0, 3] 1 [0, 3]
对上面结果的分析:code
函数 nums() 中从新定义了一个变量 a ,这个 a 是局部变量,与外面的全局变量没有关系,而全局变量 列表 b 直接被引用过来进行修改了,一样是全局变量为何会有差异呢?blog
由于格式问题引起了歧义,容器类型的数据如,列表,字典,他们的修改和建立书写格式全然不一样,不会引起奇异,而数字,字符串类型变量的定义和修改都是用 = 连接,引起了格式上的歧义,因此,当Python解释器遇到函数中的 “a = 2”这种格式时,不知道是 “引用全局变量a修改成2” 仍是 “定义一个等于 2 的变量” ,从而引起歧义,为了确保全局变量对代码其余部分产生更小的影响,Python默认为第二种——从新定义一个变量,来避免修改全局变量对总体代码产生其余未知影响。字符串
综上所述:class
本质:格式引起的歧义问题容器
运用:对于字典,列表不会由于格式问题引起歧义的,不用管他;对于数字,字符串来讲,当引用与建立发生歧义时,Python解释器默认建立新的变量,若不想建立,只是想修改全局变量,须要加global声明,另外,若是只是单纯的引用全局变量,而不会产生歧义的,如 对于全局变量 a 来讲,b = a + 5,这里只是单纯的使用,不会产生格式上的歧义问题,也不须要加global。变量