提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
记录学习中知识点
一、名词解释
全局变量和局部变量:
函数的参数以及函数体中定义的所有变量,共同构成了该函数的本地命名空间,所有的变量被称为该函数的本地变量,这些变量的作用范围只是在函数中有用。所以也称为局部变量,不是本地变量的变量被称为全局变量。
系统每次执行一个函数时,就会创建新的本地(局部)命名空间。改命名空间代表一个局部环境,解析这些名称时解释器将首先搜索局部命名空间,如果局部命名空间中没有找到匹配的值,就会在全局命名空间找,如果全局命名空间也没有匹配的值,最后会在内置命名空间中找,如果还找不到就会抛出NameError错误。
二、使用步骤
1,函数作用域
函数模板:
def 函数名( [参数] ):
函数体
[return 返回值]
代码示例1:
1 def func():#定义函数
2 a = 8 #a是局部变量,此变量的作用范围就是行2和行3
3 print(a)
4 priint(a) #此处a会报错。因为a的作用域就是行2,3。超出行2,3范围后a就不能被调用了,就会报错。报错信息:NameError: name 'a ’ in not defined.
2,全局变量&局部变量
全局变量:在class和def间且和def齐头写,在py文件的任何位置都能调用
局部变量:在def中且有缩进,在py文件中只能函数体中调用,其他任何地方不能调用。
注:在def和def间且有缩进的变量叫闭包变量,这里简单的记录下
代码示例2:
1, age = 18 #全局变量
2, def func():
3, name = ‘李四’ #局部变量
4, print(name=',name)
5,print(‘age=’,age) #此程序运行结果输出的是 18
为什么输出结果不是name=李四和age=18呢?
程序中第一行定义一个全局变量age并给age赋值18,也叫赋值即定义,第2行定义一个函数func,第3,4行,定义一个局部变量和输出局部变量,第5行数据age
至于为什么输出结果只有age=18,而不是name=李四和age=18呢?是因为在程序中如果函数没有被调用,就不会被执行,即上面的程序用只定义个函数func,并没有调用函数func,所以输出结果就不会有name=李四。
代码示例3:
1, age = 18 #全局变量
2, def func():
3, age = 8 #这里的age是局部变量,将20赋值给age(赋值即定义)
3, name = ‘李四’ #局部变量
4, print(name=',name,‘age=,age’)
5,print(‘name=’,name,‘age=’,age) #此处name会报错,name超出的它 的作用范围,报NameError错误
可能会有疑问,为什么全局变量和局部变量一样呢,而且还不报错,将代码修改,就可以看清楚了,修改成代码示例4
代码示例4:
1,age = 18
2,print(‘age_id=’,id(age)),
3,def func():
4, age=8
5, print(‘ageid=’,id(age))
6, name = ‘李四’
7, print(‘name=’,name,‘age=’,age)
8,print(‘age=’,age)
9,func()
我们在程序第2行,第5行使用id函数,分别将age的在运行环境中的地址打印出来,第2行输出:age_id= 1864134208,第5行输出:ageid= 1864133888
可以看出两个age的指向不是一个地址,那为什么会执行第5,7行代码呢?是因为我们在程序新增一行代码即第9行,第9行的意思就是调用函数func,这样就会执行函数func中的函数体了,执行顺序是从上而下执行。
代码示例5;
1,age = 18
2,print(‘age_id=’,id(age)),
3,def func():
4, myage= age +1
5, print(‘ageid=’,id(myage))
6, name = ‘李四’
7, print(‘name=’,name,‘myage=’,myage)
8,func(),
9,print(‘age=’,age)
在程序的第4行,先在本地命名空间找age,本地命名空间没找到,就去全局命名空间找,找到age=18,
之后在执行18+1然后在将19赋值给myage
注:变量赋值过程是先执行 ‘=’ 右边的,执行往后在赋值非‘=’左边的变量
总结
加油!加油!加油!