一、小数据池
-
== (等于)
-
== 官方:判断等号两边的内容是否相同
白话:判断两个人长得是不是一样
-
is
官方:判断两边的内容是不是一个
白话:判断这两个人是不是一个人
-
a = 10000
-
b = 10000
-
print(a == b)
is 是通过内存地址进行判断
print(id(a),id(b))
输出结果 ,内存地址一致
-
代码块:一个py文件,一个函数,一个模块,一个类,交互模式(终端)下的每一行
先执行代码块,然后小数据池!
**代码块机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象, **满足缓存机制则他们在内存中只存在一个,即:id相同。
** **终端中测试的是小数据池缓存机制:
数字: -5 ~ 256
字符串:
定义时内容(除去中文,特殊符号)长度不限,内容相同,就进行驻留。
python 3. 6解释器字符串进行乘法时(不能有中文和特殊符号),总长度不能超过20
python 3. 7解释器字符串进行乘法时(不能有中文和特殊符号),总长度不能超过4096
** **pycharm 中测试的是代码块的缓存机制:
数字: -5 ~ 正无穷
字符串:
定义时内容长度不限,内容相同,就进行驻留
字符串进行乘法时(不能有中文和特殊符号),总长度不能超过20
二、深浅拷贝
赋值操作
lst = [1,2,3] # 可变数据类型
lst1 = lst
lst.append(4)
print(lst,lst1) # lst赋值给了lst1 共用一块内存空间,故lst 添加,lst1也添加
输出结果 [1,2,3,4] [1,2,3,4]
# 总结: 多个变量指向同一个内存地址,如果这个内存地址的数据是
# 修改时不可变的数据类型时,会新开辟空间(字符串,数字)
# 修改时可变的数据类型时,会在原地进行修改(列表,字典)
浅拷贝
浅拷贝只把原列表中记录的内存地址拿到一个新开辟的列表中为了更好理解,看例子上图!
lst = [1,2,3,[6,7,8]]
# lst2 = lst[:] # 浅拷贝
lst2 = lst.copy()
图中橙色的是新开辟的空间,浅蓝色的是数字类型,红色的列表类型
lst = [1,2,3,[6,7,8]]
lst2 = lst.copy()
lst[1] = "22"
我们修改成字符串"22" 就是在列表中将以前的内存地址更换成新开辟的空间地址
lst = [1,2,3,[6,7,8]]
lst1 = lst.copy()
lst[-1].append(9)
浅拷贝总结:浅拷贝只开辟最外层空间,其中元素的内存地址都是一样的,就是共用,当不可变数据类型,像int,str,bool这些元素添加或删除或修改的时候都不会互相影响,因为他们需要自行开辟空间,而可变数据类型,修改或添加或删除不需要从新开辟空间,在自己的空间内增删改,所以原拷贝对象变化,拷贝的对象也会变化。
深拷贝
import deepcopy
lst = [1,2,3,[6,7,8,9]]
lst1 = copy.deepcopy(lst)
lst[-1].append(10)
深拷贝:深拷贝不可变元素共用,若各自修改都需自己开辟空间,不会一同改变,假如lst中1需要删除,他的内存地址会删,但是lst2复制的内存地址还是指向1,不会改变,可变数据类型中里面的元素共用,导致各自改变各自的列表内元素,相互不会受到影响,并且列表空间地址不一样,所以各自更改元素受影响的只是自己列表地址空间中的元素而已,不会受到影响!