数据类型的底层实现
一、从奇怪的列表说起
1.1 错综复杂的复制
list_1 = [1, [22, 33, 44], (5, 6, 7), {
"name": "Sarah"}]
- 浅拷贝
# list_3 = list_1 # 错误!!!
list_2 = list_1.copy() # 或者list_1[:] \ list(list_1) 均可实习浅拷贝
- 对浅拷贝前后两列表分别进行操作
list_2[1].append(55)
print("list_1: ", list_1)
print("list_2: ", list_2)
output:
list_1: [1, [22, 33, 44, 55], (5, 6, 7), {‘name’: ‘Sarah’}]
list_2: [1, [22, 33, 44, 55], (5, 6, 7), {‘name’: ‘Sarah’}]
更改list1,list2也发生改变
1.2 列表的底层实现
引用数组的概念
列表内的元素可以分散的存储在内存中
列表存储的,实际上是这些元素的地址!!!——地址的存储在内存中是连续的
list_1 = [1, [22, 33, 44], (5, 6, 7), {
"name": "Sarah"}]
list_2 = list(list_1) # 浅拷贝 与list_1.copy()功能一样
潜拷贝将列表复制了一份,列表中存储的地址不变,地址指向的内存不变。
(1)新增元素
list_1.append(100)
list_2.append("n")
print("list_1: ", list_1)
print("list_2: ", list_2)
output:
list_1: [1, [22, 33, 44], (5, 6, 7), {‘name’: ‘Sarah’}, 100]
list_2: [1, [22, 33, 44], (5, 6, 7), {‘name’: ‘Sarah’}, ‘n’]
原list1、list2,列表存储如下所示,
(2)修改元素
list_1[0] = 10
list_2[0] = 20
print("list_1: ", list_1)
print("list_2: ", list_2)
output:
list_1: [10, [22, 33, 44], (5, 6, 7), {‘name’: ‘Sarah’}, 100]
list_2: [20, [22, 33, 44], (5, 6, 7), {‘name’: ‘Sarah’}, ‘n’]
将list1、list2的0处地址进行替换
(3)对list中列表型元素进行操作
list_1[1].remove(44)
list_2[1