随笔记录方便自己和同路人查阅。
#------------------------------------------------我是可耻的分割线-------------------------------------------
在被调用函数内赋值的変元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。
处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。一个变量必是其中一种,不能
即是局部又是全局。
可以将“作用域”看成是变量的容器,当作用域被销毁时,所有保存在该作用域内的变量的值就被丢弃了。只有一个
全局作用域,它是程序开始时创建的。如果程序终止,全局作用域就被销毁,他的所有变量就被丢弃了。否则,下次你
运行程序的时候,这些变量就会记住他们上次运行时的值。
一个函数被调用时,该函数返回时,这个局部作用域就被销毁了,这些变量就丢失了。下次调用这个函数,局部变量
不会记得该函数上次被调用时它们保存的值。
作用域很重要,理由如下:
(1)全局作用域中的代码不能使用任何局部变量
(2)但是,局部作用域可以访问全局变量
(3)一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量
(4)如果在不同作用域中,你可以使用相同的名字命名不同变量。也就是说可以有一个名为spam的局部变量,和一个
名为spam的全局变量
Python有不同的作用域,而不是让所用东西都成为全局变量,这是有理由的。这样一来,当特定函数调用中的代码修改
变量时,该函数与程序其他部分的交互,只能通过他的参数和返回值。这就缩小了可能导致缺陷的代码作用域。如果程序只
包含全局变量,又有一个变量赋值错误的缺陷,那就很难追踪这个赋值错误发生的位置。它可能在程序的任何地方赋值,而
你的程序可能有几百到几千行!但如果缺陷是因为局部变量做粗赋值,你就会知道,只有那一个函数中的代码可能产生赋值
错误。
虽然在小程序中使用全局变量没有太大问题,但当程序变得越来越大时,依赖全局变量就是一个坏习惯。
#------------------------------------------------我是可耻的分割线-------------------------------------------
1、局部变量不能在全局作用域内使用,示例代码:
# # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def hell():#定义一个函数 local = 1+1#定义一个局部变量
hello() print(local)#在全局作用域打印局部变量
运行结果:
发生错误是因为,local只属于hello函数创建的局部作用域。在程序执行从hello()函数返回后,该局部作用域就被销毁了,
不在有名为local的变量。所以当程序试图执行print(local)时,Python就报错,说local没有定义。这是有意义的,当程序执行
在全局作用域中时,不存在局部作用域,所以不会有任何局部变量。这就是为什么只有全局变量能用于局部作用域。
2、局部作用域不能使用其他局部作用域内的变量,示例代码:
# # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def hello():#定义一个函数1 hello_local = 1+1#定义一个局部变量 def world():#定义一个函数2 world_local = hello_local+1#使用函数1中的局部变量 world()#调用函数
运行结果:
3、全局变量可以在局部作用域中读取,示例代码:
# # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def hello():#定义一个函数1 print(name)#打印全局变量 name ="Li Rong Yang"#全局变量 hello()#调用函数
运行结果:
4、名称相同的局部变量和全局变量
局部变量是可以和全局变量同名的,在语法上完全合法。但我们在写代码时应尽量避免局部变量和全局变量同名。
示例代码:
# # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def spam(): eggs = 'spam local' print(eggs) def bacon(): eggs = 'bacon loacl' print(eggs) spam() print('我是spam的 eggs:%s',eggs) eggs = 'global' bacon() print(eggs)
运行结果:
从运行结果可以看出,两个函数中的局部变量eggs和全局变量eggs都被打印了。