day3-作用域、局部和全局变量
背景
我们在写代码时,都要声明变量,但是我们可曾想过变量的作用范围?今天我们就来说一下变量的作用域。首先我们根据变量的作用范围把变量分为:
- 局部变量
- 全局变量
定义
1.局部变量
说明:指在局部生效,定义在函数体内的变量,只能在函数里面生效,出了这个函数体,就不能找到它,这个函数就是这个变量的作用域。
示例代码如下:
def change_name(name): print("before change:",name) name="HU WEI" #定义在函数体内=>局部变量 print("after change:",name) name="hu wei" change_name(name) print(name) #输出 before change: hu wei after change: HU WEI #局部变量=》只在函数体内生效 hu wei
解析:在函数体内的局部变量,也就是说这个函数就是这个变量的作用域。出了这个函数,就找不到这个变量了。
2.全局变量
说明:指的是在整个程序中都生效的变量,在整个代码的顶层定义。
代码如下:
school = "SuZhou University" #定义全局变量 def change_name(name): school="Nanjing University" #定义局部变量 print("before change:",name,school) name="HU WEI" print("after change:",name) name="hu wei" change_name(name) print(name,school) #输出 before change: hu wei Nanjing University #打印局部变量 after change: HU WEI hu wei SuZhou University #打印全局变量
解析:可以看出,变量的优先级是局部变量高于全局变量的,当函数体内没有局部变量,才会去找全局变量。但是如果我想在函数体内修改全局变量,应该如何做呢?
一、函数里面修改全局变量
1.在函数体内使用关键字global声明一下全局变量
2.在函数体内将全局变量名重新赋值
school = "SuZhou University" #定义全局变量 def change_name(name): global school #使用global声明全局变量 school = "Nanjing University" #将全局变量重新赋值 print("before change:",name,school) name="HU WEI" print("after change:",name) name="hu wei" change_name(name) print(name,school) #输出 before change: hu wei Nanjing University after change: HU WEI hu wei Nanjing University #打印被强制修改后的全局变量
二、只在函数里面声明全局变量
def change_name(name): global school #global关键字定义全局变量 school = "Nanjing University" print("before change:",name,school) name="HU WEI" print("after change:",name) name="hu wei" change_name(name) print(name,school) #输出 before change: hu wei Nanjing University after change: HU WEI hu wei Nanjing University #打印全局变量
注意:对于以上只在函数体内定义全局变量,我们不建议这么做,因为在整个程序中全局变量有可能用于多个函数,这样会导致程序出现问题。
三、可修改列表,字典,集合,类(class)
name =["huwei","yangguang","hujiayang"] #定义一个列表 def change_name(name): global school print("before change:",name) name[0]="huw22" print("after change:",name) change_name(name) print(name) #输出 before change: ['huwei', 'yangguang', 'hujiayang'] after change: ['huw22', 'yangguang', 'hujiayang'] #打印函数内修改后的全局变量 ['huw22', 'yangguang', 'hujiayang'] #打印函数外修改后的全局变量
注:除了以上,在函数体内不能修改全局的字符串和整数。
总结:
1.在子程序(函数)中定义的变量称为局部变量,在程序一开始定义的变量称为全局变量;
2.全局变量的作用域是整个程序,局部变量的作用域是定义该变量的函数体内;
3.当全局变量和局部变量同名时:在定义局部变量的函数体内,局部变量起作用;在其他地方,全局变量起作用。