目标:
- 变量的引用
- 可变与不可变类型
- 局部变量和全局变量
01 变量的引用
在python 中,变量和数据是分开存储的,数据保存在内存中的一个位置,变量中保存着数据在内存中的地址。变量中 记录数据的地址(本质上就是一个数字),就叫做引用。使用id()函数可以查看变量中保存数据所在的内存地址。
注意:
- 如果变量已经定义,当给一个变量赋值时,本质上是修改了数据的 引用。变量不再对之前的数据引用,改为对新赋值的数据引用。
- 在python 中,函数的实参和返回值都是靠 引用来传递
02 可变和不可变类型
不可变类型:内存中的数据不允许被修改
- 数字类型 int ,bool ,float ,complex ,
- 字符串 str
- 元组 tuple
可变类型:内存中的数据可以被修改
- 列表 list
- 字典 dict
用 变量名.方法 可以修改保存的数据而不修改引用,但是用赋值语句是修改的 引用
补充:
- python 中内置有一个名字叫做 hash()的函数,此函数接收一个 不可变类型 的数据作为 参数,返回结果是一个整数。
- 哈希 是一种算法,其作用就是提取数据的 特征码(指纹),即:
相同的内容得到相同的结果,不同的内容的得到不同的结果 - 在python 中设置字典的键值对时,首先会对key 进行 hash 以决定如何在内存中保存字典的数据,以方便后续 对字典的操作,进行 增、删、改、查。因此,键值对的key必须是不可变数据类型,而value 可以是任意数据类型
03 局部变量和全局变量
- 局部变量 是在函数内部 定义的变量,只能在函数内部使用
局部变量在 函数执行时 才会被创建
函数执行结束后,函数内部的局部变量,会被系统收回。
局部变量在生命周期内,可以用来存储 函数内部临时使用到的数据
不同的函数,可以定义相同名字的局部变量,但是各用各的,相互之间不会产生影响
- 全局变量 是在函数外部定义的变量,所有函数 内部 都可以使用这个变量
在python 中,是不允许直接修改全局变量的值,如果在函数内部使用赋值语句,则其实是会在函数内部定义一个局部变量。
注意:在其他开发语言中,大多不推荐使用全局变量——可变范围太大,导致程序不好维护。但是python 中由于不能 在函数内部直接修改全局变量的引用,因此还比较常用。如果我们希望在函数内部修改全局变量,使用 global 声明一下变量即可。global 关键字会告诉解释器后面的变量是一个全局变量,在使用赋值语句时,就不会创建局部变量。
注意:在开发时,应该把模块中的所有全局变量定义在所有函数上方,就可以保证所有的函数都能够正常的访问到每一个全局变量了。
代码结构示意图: