python-深浅拷贝
第四章 内存相关和深浅拷贝
1 内存相关
1.1 id is ==
is 和 == 的区别
i = 100
s = 'alex'
print(id(i))
print(id(s))
-
== 【比较的是两边的值是否相等】
l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(l1 == l2)
s1 = 'alex'
s2 = 'alex '
print(s1 == s2)
-
is 【用于比较内存地址是否相同】
l1 = [1, 2, 3]# 重新开辟内存,并赋值
l2 = [1, 2, 3]
print(id(l1))
print(id(l2))
print(l1 is l2)# False
1.2 代码块
-
基本定义:
-
代码块:我们所有的代码都需要依赖代码块执行。
-
一个文件就是一个代码块。
-
交互式命令下,一行就是一个代码块。
-
1.2.1 两个机制
-
同一个代码块下,遵循一个缓存机制。
-
前提条件:同一个代码块内。
-
机制内容:pass
-
适用的对象: int bool str
-
具体细则:所有的数字,bool,几乎所有的字符串。
-
优点:提升性能,节省内存
-
-
不同代码块下,遵循另一个缓存机制。【小数据池】
-
前提条件:不同代码块内。
-
机制内容:pass
-
适用的对象: int bool str
-
具体细则:-5~256数字,bool,满足规则的字符串。
-
优点:提升性能,节省内存。
-
小数据池:python中在不同代码块下,为了提高性能,节省内存,会将-5~256的数字和具有一定规则的字符串开辟两个空间,如果你的代码中有满足条件的数据,不会重新创建,还是引用提前创建好的。
-
1.3 深浅copy
-
浅拷贝:拷贝的是对象最外层
-
深拷贝:拷贝的是对象内部的可变类型
-
浅copy
l1 = [1, 2, 3, [22, 33]]
l2 = l1.copy()
l1.append(666)
print(l1,id(l1))
print(l2,id(l2))
-
深copy
import copy
l1 = [1, 2, 3, [22, 33]]
l2 = copy.deepcopy(l1)
# print(id(l1))
# print(id(l2))
l1[-1].append(666)
print(l1)
print(l2)
-
相关
# 应该每次都拷贝一份(但由于小数据池,未拷贝)
v1 = 'alex'
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
v1 = 'alex'
import copy
v3 = copy.deepcopy(v1)
print(id(v1),id(v3))
-
相关面试题
l1 = [1, 2, 3, [22, 33]]
l2 = l1[:] # 浅拷贝
l1[-1].append(666)
print(l1)
print(l2)
浅copy: list dict: 嵌套的可变的数据类型是同一个。
深copy: list dict: 嵌套的可变的数据类型不是同一个 。
-
示例
v1 = [11,22,33] #不管怎么变化,就看是重新赋值还是内部修改
v2 = v1
练习1 (内部修改)
v1 = [11,22,33]
v2 = v1
v1.append(666)
print(v2) # 含 666 :地址相同
练习2:(赋值)
v1 = [11,22,33]
v2 = v1
v1 = [1,2,3,4]
print(v2) :地址不相同
练习3:(重新赋值)
v1 = 'alex'
v2 = v1
v1 = 'oldboy'
print(v2):id也会不同

浙公网安备 33010602011771号