将b赋值给e,但是b和e都指向同一个内存地址
b = [10, 20, 30, [40, 41]]e = b
print('id(b)=', id(b)) # 2233189087488
print('id(e)=', id(e)) # 2233189087488
若更改b的内容,e也会跟着变化
b.append(99)print('b:', b) # [10, 20, 30, [40, 41], 99]
print('e:', e) # [10, 20, 30, [40, 41], 99]
copy:python内置函数,对原有数据建立副本。
b = [10, 20, 30, [40, 41]]
d = b.copy()
print('b:', b)#[10, 20, 30, [40, 41]]
print('d:', d)#[10, 20, 30, [40, 41]]
看似拷贝后内容不变,但是内存地址变化了。
print('id(b)=', id(b)) # 2768919337344
print('id(d)=', id(d)) # 2768919277888
若更改b的内容,d不会变化
b.append(99)
print('b:', b) # [10, 20, 30, [40, 41], 99]
print('d:', d) # [10, 20, 30, [40, 41]]
上述可知,对于列表b,若使用copy函数进行副本建立后,在原列表b增加了新元素后,副本内未增加新元素,但是可以看到,列表b内还包含了一个列表[40,41]。
b = [10, 20, 30, [40, 41]]
d = b.copy()print('id(b)=', id(b)) # 2768919337344
print('id(d)=', id(d)) # 2768919277888
print('id(b[-1])=', id(b[-1])) # 1580034370560
print('id(d[-1])=', id(d[-1])) # 1580034370560
可以看出,copy后,整个列表外层的内存地址发生了变化,但内部嵌套的列表的地址未发生变化。
改变b的内层列表的内容,d也会跟着变化。
b = [10, 20, 30, [40, 41]]
d = b.copy()
b[-1].append(1000)
print(b)#[10, 20, 30, [40, 41, 1000]]
print(d)#[10, 20, 30, [40, 41, 1000]]
当改变原数据的一级目录时,副本不会发生变化;但是改变原数据的二级目录时,副本也会跟着变化,copy函数对于一级目录是深拷贝,对于二级目录是浅拷贝。那怎么实现对二级目录的深拷贝呢?使用copy.deepcopy函数。
import copy
b = [10, 20, 30, [40, 41]]
d = copy.deepcopy(b)
print('id(b)=', id(b)) # 2255973788352
print('id(d)=', id(d)) # 2255974928064
print('id(b[-1])=', id(b[-1])) # 2255973802432
print('id(d[-1])=', id(d[-1])) # 2255974927808b[-1].append(1000)
print(b)#[10, 20, 30, [40, 41, 1000]]
print(d)#[10, 20, 30, [40, 41]]
此时深拷贝前后的列表内嵌入的列表的内存地址是不同的,所以对原数据进行修改,副本不会受影响。