id(object) 获取对象的内存地址
is 判断是否是同一个内存空间 == 判断值是否相同
a = [1,2,3,] b = a[:] # 相当于是浅copy,b指向了一个新的内存空间,但新内存空间中保存的内存地址还是指向了数组[1,2,3,] c = a # c和a指向了同一块内存空间 print(a is b) # False print(a is c) # True print(a==b) # True
同一代码块下的缓存机制、不同代码块下的小数据池(字符串、bool、数值)
1.赋值,指向同一块内存空间
a={'n':1} b=a # a和b不是独立的对象 print(id(a), id(b)) # 2470858078792 2470858078792 a={'n':2} print(id(a), id(b)) # 2470858079672 2470858078792
2.浅copy(当里面有可变数据类型时会导致混乱,对不可变数据类型没影响)
会开辟一个新的内存空间,但是存储的都是数据的内存地址,这些内存地址都指向同一块内存空间。(当有可变数据类型时,也就是会指向可变数据类型的内存地址)
a = [1, 2, 3, 4, [1, 2, 3]] b = a.copy() # a[:] a.append(5) print(a) # [1, 2, 3, 4, [1, 2, 3], 5] print(b) # [1, 2, 3, 4, [1, 2, 3]] a[4].append(4) print(a) # [1, 2, 3, 4, [1, 2, 3, 4], 5] print(b) # [1, 2, 3, 4, [1, 2, 3, 4]] print(id(a[0]),id(a[4])) # 140728064385424 3202058800968 和下面的深copy进行对比 print(id(b[0]),id(b[4])) # 140728064385424 3202058800968
3.深copy(互相不影响)
可变的数据类型重新创建一份;不可变的数据类型公用,与之前内存地址指向的内存空间相同
from copy import deepcopy a = [1, 2, 3, 4, [1, 2, 3]] b = deepcopy(a) a.append(5) print(a) # [1, 2, 3, 4, [1, 2, 3], 5] print(b) # [1, 2, 3, 4, [1, 2, 3]] a[4].append(4) print(a) # [1, 2, 3, 4, [1, 2, 3, 4], 5] print(b) # [1, 2, 3, 4, [1, 2, 3]] print(id(a[0]),id(a[4])) # 140728064385424 3202056259720 print(id(b[0]),id(b[4])) # 140728064385424 3202058801096