接着上次得笔记,今天还是继续函数的相关学习,局部变量、全局变量、默认值参数、参数组
关键字、 深拷贝、浅拷贝、内置函数等
一、局部变量和全局变量
全局变量与局部变量两者的本质区别就是在于作用域
1.局部变量: 只在函数内部生效,这个函数就是这个变量的作用域,
2.全局变量:作用域是整个程序
上图中的num是全部变量,num1 是局部变量
3.关键字 global
如果真想要在函数体内修改全局变量的值,就是要使用global关键字
运行结果是:
注:如果全局标量没有定义,而只是在函数内部用global 关键字定义变量,在函数外部调用,会报错,提示该函数没有定义
运行结果如下:
二、函数参数
参数能让你的函数更灵活,还可以根据调用时传参的不同来决定函数内部的执行流程,函数的参数是分形参和实参
1.形参变量:
只有在被调用时,才分配内存单元,在调用结束时,即可释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调函数后,则不能再使用该形参变量
2.实参:
可以时常量、变量、表达式、函数等,无论实参是何种类型的量,再进行函数调用时,他们必须有确定的值,以便把这些值传送给形参,因此应先预先用赋值、输入等办法使参数获得确定的值
3.函数形参中* 号的作用
可变参数,一个* 号传参,返回的是一个元组
运行结果:
4.函数形参中** 号的作用
可变参数,函数的形参中有两个** 号,函数返回的是一个字典
运行结果:
5.参数* 和** 联合用法,*是不需要关键字传参的,所以* 参数必须再 ** 参数前面,而且只有用关键字传参数了,就不能用没有关键字的参数传参。如下图:
6.调用的时候用*号,代表的是解包(解的是字符串、元组、列表等有序的数据类型)
运行结果:
7.指定传参的类型,格式如下:
:str 是指定要传参数的类型,但是如果不按照指定的类型传参数,也是可以的,不会报错
三、递归
递归 ,函数自己调用自己 最深999次,y也是循环的一种,但是能用循环,别用递归
运行结果:
四、python 中的复制,深拷贝和浅拷贝
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用
深拷贝和浅拷贝的区别: 浅拷贝不会开辟新的内存地址,深拷贝会新开劈新的内存地址
1.浅拷贝:浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素
2.深拷贝:深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本(另开辟内存)
下图中有两中浅拷贝和深拷贝的方式:
l5 = copy.copy(li) # 如果是一层的话,算深拷贝,但是数据中又加一层,就不行,所以也算浅拷贝
3.globals() 打印该模块中所有的变量
4. locals() 打印该方法中所有的变量