15.变量进阶
3)局部变量和全局变量
局部变量是在函数内部定义的变量,只能在函数内部使用
全局变量是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量
提示:在其他的开发语言中,大多不推荐使用全局变量。全局变量可变范围太大,导致程序不好维护!
(1)名称空间和作用域
①名称空间
(a)内置名称空间:放解释器内部的一些方法和函数,print input del等
(b)全局名称空间:在全局py文件中,放置全局变量、函数
(c)局部名称空间:在函数内部的变量、函数
②作用域
(a)全局作用域:可以随便使用,内置名称空间+全局名称空间 globals()
(b)局部作用域:在函数内部局部使用,局部名称空间.可以使用locals()查看当前作用域的变量和函数
(2)局部变量
①局部变量的概念
局部变量是在函数内部定义的变量,只能在函数内部使用
函数执行结束后,函数内部的局部变量,会被系统回收
不同的函数,可以定义相同的名字的局部变量,但是彼此之间不会产生影响
②局部变量的作用
在函数内部使用,临时保存函数内部需要使用的数据
③局部变量的生命周期
所谓生命周期就是变量从被创建到被系统回收的过程。
局部变量在函数执行时才会被创建
函数执行结束后局部变量被系统回收
局部变量在生命周期内,可以用来存储函数内部临时使用到的数据
④nonlocal可以在函数内部修改外部的局部变量
在局部,内层函数引入外层函数的局部变量
nonlocal可以一层一层的往外找到最近的局部变量,但找到最外层的局部变量还没有时会报错,而且不会找到全局变量。
(3)全局变量
①全局变量的概念
全局变量是在函数外部定义的变量,所有函数内部都可以使用这个变量
函数执行时,使用变量的顺序:
首先查找函数内部是否存在指定名称的局部变量,如果有,直接使用;
如果没有,查找函数外部是否存在指定名称的全局变量,如果有,直接使用;
如果还没有,程序报错!
②函数不能直接修改全局变量的引用
全局变量是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量
提示:在其他的开发语言中,大多不推荐使用全局变量。全局变量可变范围太大,导致程序不好维护!
在函数内部,可以通过全局变量的引用获取对应的数据
但是,不允许直接修改全局变量的引用,需要使用赋值语句修改全局变量的值
注意:只是在函数内部定义了一个局部变量而已,只是变量名相同。在函数内部不能直接修改全局变量的值
③在局部修改全局变量global
如果在函数中需要修改全局变量,需要使用“global”进行声明,使用“global”也可以在函数内部创建全局变量
④全局变量定义的位置
为了保证所有的函数都能够正确使用到全局变量,应该将全局变量定义在其他函数的上方
注意:由于全局变量name,是在调用函数之后才定义的,在执行函数时,变量还没有定义,所以程序会报错!
⑤代码结构示意图如下
⑥全局变量命名的建议
为了避免局部变量和全局变量出现混淆,在定义全局变量时,有些公司会有一些开发要求,例如:全局变量名前应该增加“g_”或者“gl_”的前缀
4)深浅拷贝
拷贝的意义:快速创建对象 –> 克隆。切片属于浅拷贝
(1)浅拷贝
浅拷贝:只拷贝第一层内容,复制一个表面,更深层次的内容(可变数据),只拷贝一个内存地址。用法:变量.copy() 或 [:]切片
①第一种现象(修改不可变元素)
②第二种现象(修改可变元素)
浅拷贝只复制了可变数据的地址,并没有复制真实的数据。因此可变数据发生变化时,两个列表中的数据都会变化
(2)深拷贝
用法:
import copy
copy.deepcopy(被复制变量)
深拷贝是将数据完整的复制了一份。
(3)赋值
赋值比浅拷贝还要肤浅,赋值不会创建新的数据,只是获取了内存地址