python基础(十四、变量进阶

15.变量进阶
1)变量的引用
变量和数据都是保存在内存中的。
在Python中函数的参数传递以及返回值都是靠引用传递的。
(1)引用的概念
①在Python中变量和数据是分开存储的
②数据保存在内存中的一个位置,变量中保存着数据在内存中的地址
③变量中记录数据的地址,就叫做引用
④使用id()函数可以查看变量中保存数据所在的内存地址
注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是修改了数据的引用,
变量不再对之前的数据引用,变量改为对新赋值的数据引用

(2)变量引用 的示例
在Python中,变量的名字类似于便签纸贴在数据上

(3)小数据池
为了节省内存,提高效率,python有小数据池的概念,意思为当你执行一个代码块时,python会先检查这个代码块是否存在,存在则重用,不存在则新建。
小数据池,也称为小整数缓存机制,或者称为驻留机制等等.
小数据池也是只针对 int(float),str,bool。
int(float):任何数字在同一代码块下都会复用。
bool:True和False在字典中会以1,0方式存在,并且复用。
str:几乎所有的字符串都会符合缓存机制
实现机制:
执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。
①int(float)
(a)Python自动将 -5~256 的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。

(b)其它的int和float被创建时会被存入小数据池。但每次运行内存地址会变化

②字符串
我们创建字符串时,python会将一定规则的字符串(绝大多数)在字符串驻留池中创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。

③bool型
只有True,False,Python自动将它们进行了缓存。无论你创建多少个变量指向True,False,那么他在内存中只存在一个。

(4)函数的参数和返回值的传递
在Python中,函数的实参/返回值都是靠引用来传递来的。

2)可变和不可变类型
(1)不可变类型
内存中的数据不允许被修改(可以通过修改内存地址重新赋值,但不能修改内存地址中保存的数据):
①数字类型 int, bool, float, complex, long(2.x)
②字符串 str
③元组 tuple

(2)可变类型
内存中的数据可以被修改(不改变变量中保存的内存地址,可以改变内存地址中的数据,通常使用方法调用修改内存地址中的数据):
①列表 list
②字典 dict



注意:字典的key只能使用不可变类型的数据

注意:
可变类型的数据变化,是通过方法来实现的。
如果给一个可变类型的变量,赋值了一个新的数据,引用会修改:变量不再对之前的数据引用,变量改为对新赋值的数据引用

(3)哈希 (hash)
①哈希的概念
Python中内置有一个名字叫做hash(o)的函数,接收一个不可变类型的数据作为参数,返回结果是一个整数。
哈希是一种算法,其作用就是提取数据的特征码(指纹),相同的内容得到相同的结果,不同的内容得到不同的结果

②为了保证字典key的不可重复,保存字典时要对key进行哈希
在Python中,设置字典的键值对时,会首先对key进行hash已决定如何在内存中保存字典的数据,以方便后续对字典的操作:增、删、改、查
键值对的key必须是不可变类型数据,键值对的value可以是任意类型的数据

(4)MD5
MD5一般用来验证文件或密码的一致性
①获取MD5字符串

②MD5加盐
MD5目前已经可以破解,可以通过MD5加盐来提高保密程度

③MD5应用
用户注册和登录,比较密码

(5)计算大文件的MD5值
计算大文件的MD5值可以保证获取文件的完整性和正确性

注意:md5.update会将每次字符串拼接。

原文地址:https://www.cnblogs.com/bdzxh/p/14061858.html