什么是作用域
变量并非到处都能用。它「在哪儿能用、在哪儿没用」的范围,就叫作用域。用「分房间的房子」理解最直观:每个函数像一个房间,放在房间里的东西,别的房间看不到。
局部变量:关在函数里
在函数里面定义的变量叫局部变量(local,本地的)。它函数一运行才出生、一结束就消失,外面完全访问不到:
def room():
msg = "房间里的东西"
print(msg) # 房间里能用
room()
print(msg) # 报错!出了房间 msg 就没了全局变量:里能看外,外看不到里
在函数外面(顶层)定义的变量叫全局变量(global),像客厅公共区的东西,每个房间探头都看得见:
name = "小明" # 全局
def greet():
print(name) # 函数里能读到外面的 name
greet() # 小明可见性是单向的:由内向外能看(房间望得见客厅),由外向内看不见(客厅看不到房间里的私人物品)。
能读不能改,以及正确做法
函数能读外面的变量,但默认改不了。在函数里给同名变量赋值,Python 会当成新建一个局部变量,外面那个全局的纹丝不动:
count = 0
def add_one():
count = 100 # 新建的局部,跟外面无关
add_one()
print(count) # 还是 0这条规矩是一道安全墙:每个函数关起门折腾自己的局部变量,不会误伤别人,程序才好维护。要把结果带出来,正道是用 return,外面 count = add_one(count) 自己接住更新。口诀:进函数用参数,出函数用 return。