变量的作用范围又叫作用域,根据变量的作用范围把变量分为:局部变量和全局变量。
一个函数体内部调用另外一个函数,代码如下:
1 def test(name,age=18,**kwargs): 2 print(name) 3 print(age) 4 print(kwargs) 5 logger("test") #调用logger函数 6 7 def logger(sounce): 8 print("from %s"%sounce)
①logger函数之后执行
1 def test(name,age=18,**kwargs): 2 print(name) 3 print(age) 4 print(kwargs) 5 logger("test") 6 7 def logger(sounce): 8 print("from %s"%sounce) 9 10 test("zhou",age=23,sex="m",hobby="tesla") #在logger函数之后调用
#输出
zhou
23
{'hobby': 'tesla', 'sex': 'm'}
from test
②logger函数之前执行
1 def test(name,age=18,**kwargs): 2 print(name) 3 print(age) 4 print(kwargs) 5 logger("test") 6 7 test("zhou",age=23,sex="m",hobby="tesla") #在logger函数之前调用 8 9 def logger(sounce): 10 print("from %s"%sounce)
#输出
zhou
23
{'hobby': 'tesla', 'sex': 'm'}
Traceback (most recent call last):
File "D:/PycharmProjects/pyhomework/day3/局部变量和全局变量/test.py", line 12, in <module>
test("zhou",age=23,sex="m",hobby="tesla")
File "D:/PycharmProjects/pyhomework/day3/局部变量和全局变量/test.py", line 10, in test
logger("test")
NameError: name 'logger' is not defined #命名错误:logger没有被定义
在logger函数之前执行,logger函数还没有被读到内存中,所以报错。
1、局部变量
局部变量:指在局部生效,定义在函数体内的变量只能在函数里面生效,出个这个函数体,就不能找到它,这个函数就是这个变量的作用域
1 def test(name): 2 print("before change:",name) 3 name = "zhou" #局部变量name,只能在这个函数内生效,这个函数就是这个变量的作用域 4 print("after change:",name) 5 6 name = "alex" 7 print("-----调用test-----") 8 test(name) 9 print("------打印name----") 10 print(name)
#输出
-----调用test-----
before change: alex
after change: zhou #局部变量生效
------打印name----
alex
2、全局变量
全局变量:指的是在整个程序中都生效的变量,在整个代码的顶层声明。
1 school = "laonanhai edu" #定义全局变量 2 3 def test_1(): 4 print("school:",school) 5 6 def test_2(): 7 school = "zhou linux " 8 print("school:",school) 9 10 print("------test_1----") 11 test_1() 12 print("------test_2----") 13 test_2() 14 print("----打印school--") 15 print("school:",school)
#输出
------test_1----
school: laonanhai edu #打印的是全局变量
------test_2----
school: zhou linux #打印局部变量
----打印school--
school: laonanhai edu #打印全局变量
从上面的例子可看出全局变量的优先级是低于局部变量的,当函数体内没有局部变量,才会去找全局变量。
①函数里面修改全局变量
- 改前用global先声明一下全局变量
- 将全局变量重新赋值
1 school = "laonanhai edu" #定义全局变量 2 3 def test(): 4 global school #用global关键字声明全局变量 5 school = "zhou linux " #将全局变量重新赋值 6 print("school:",school) 7 8 print("------test_2----") 9 test() 10 print("----打印school--") 11 print("school:",school)
#输出
------test_2----
school: zhou linux
----打印school--
school: zhou linux #全局变量被改掉
②只在函数里面声明全局变量
1 def test(): 2 global school #只在里面定义全局变量 3 school = "zhou linux" 4 print("school:",school) 5 6 print("--------test-------") 7 test() 8 print("-----打印school----") 9 print("school:",school)
#输出
--------test-------
school: zhou linux
-----打印school----
school: zhou linux
也是可以的,但是我们最好不要用以上2种情况,也就是说最好不要用global这个关键字,因为你用了,其他人调你的函数时,就乱套了,而且还不好调试
③修改列表
1 names = ['alex',"zhou"] #定义一个列表 2 3 def test(): 4 names[0] = "金角大王" 5 print(names) 6 7 print("--------test-----") 8 test() 9 print("------打印names--") 10 print(names)
#输出
--------test-----
['金角大王', 'zhou'] #函数内的names输出
------打印names--
['金角大王', 'zhou'] #函数外的names输出
注:从上面的例子可以看出,列表names被当做在函数中全局变量,重新赋值了,是可以被修改的。
小结:1、只有字符串和整数是不可以被修改的,如果修改,需要在函数里面声明global。2、但是复杂的数据类型,像列表(list)、字典(dict)、集合(set),包括我们后面即将要学的类(class)都是可以修改的。
总结
- 在子程序(函数)中定义的变量称为局部变量,在程序一开始定义的变量称为全局变量。
- 全局变量的作用域是整个程序,局部变量的作用域是定义该变量的子程序(函数)。
- 当全局变量和局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其他地方,全局变量起作用。