10.深浅拷贝
1.赋值
l1=[1,2,3,4,[5,6,7]]
l2=l1 #赋值 赋值不是拷贝
l1.append(8)
print(l1)
print(l2)
2.浅拷贝
l1=[1,2,3,4,[5,6,7]]
l2=l1[:]#浅拷贝
l2=l1.copy()#浅拷贝---只拷贝第一层
print(id(l1[0]))#内存地址相同
print(id(l2[0]))#内存地址相同
浅拷贝会创建一个新的列表(容器),
新创建的列表中的元素和原列表的元素用的是同一内存空间
l1 = [1,2,3,4]
l2 = l1.copy()
print(l1)
print(id(l1))
print(id(l2))
print(id(l1[0]))
print(id(l2[0]))
两个容器的内存地址不同,里面与元素的内存地址相同
例1:
li = [1,2,32,[3,4,5]]
l2 = li.copy()
li.append(8)
print(l2)#[1, 2, 32, [3, 4, 5]]
print(li)#[1, 2, 32, [3, 4, 5], 8]
li[-1].append(8)
print(l2)#[1, 2, 32, [3, 4, 5, 8]]
print(li)#[1, 2, 32, [3, 4, 5, 8]]
例2:
l1 = [1,2,3,(1,2,3)]
l2 = l1.copy()
l2[-1] = 6
print(l1) # 不变[1,2,3,(1,2,3)]
print(l2) # 不变[1,2,3,6] 改变了列表中最后一个元素的指向关系
l1 = [1,2,3,4,[5,6,7,]]
l2 = l1.copy()
l1[-1].append(8)
print(l2) #[1,2,3,4,[5,6,7,8]]
3.深copy
import copy
li = [1,2,3,4,5,[6,7,8]]
l2 = copy.deepcopy(li)
print(li)
# print(id(li))
print(id(li[-1]))
print(l2)
# print(id(l2))
print(id(l2[-1]))
深拷贝 --
不可变的数据类型和原列表指向同一个空间
可变数据会创建一个新的空间
1.
import copy
li = [1,2,3,4,5,[6,7,8]]
l2 = copy.deepcopy(li)
li[-1].append(678)
print(li)#[1, 2, 3, 4, 5, [6, 7, 8, 678]]
print(l2)#[1, 2, 3, 4, 5, [6, 7, 8]]
2.
import copy
li = [3,4,5,[1,2,3,4],6,7,8,{"k":'v'}]
l2 = copy.deepcopy(li)
li[-1]['k'] = "a"
print(li)
print(l2)
例1:
dic = {} # "v":4
li = [] #[{"v":0},{"v":1},{"v":2},{"v":3},{"v":4}]
for i in range(0,5):
dic["v"] = i
li.append(dic)
print(li)
>>>[{'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}]
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 想让你多爱自己一些的开源计时器
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析