当前位置: 首页 > article >正文

python全栈开发《42.列表的copy函数(深浅拷贝区别)》

1.copy的功能

将当前的列表复制出一份相同的列表,可以将这个新的列表赋值给一个新的变量,新列表与旧列表内容相同,但内存空间不同。

2.copy的用法

c26cc5c4bc0833a523bb62e701a75abf.png
old_list = ['a','b','c']
new_list = old_list.copy()
print(new_list)

运行结果:

/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py 
['a', 'b', 'c']

进程已结束,退出代码为 0

3.copy与2次赋值的区别

二次赋值:
a = [1,2,3]
b = a
  • 1)二次赋值的变量与原始变量享有相同内存空间。

说明a列表与b列表都生活在一个相同的内存房子里,所以它们的数据是相同的。

a里有1,2,3,b里也有1,2,3,只不过,如果给a里加入一个元素或者删除一个元素,b里也会发生相同的变化。

同理,给b列表中添加或删除元素,a列表也会受到相同的影响。

而copy函数则有所不同。

  • 2)copy函数创建的新列表与原始列表不是同一个内存空间,不同享数据变更。

b列表参照a列表又造了一个内存房子,并且内部的成员长得都一样。

但是因为是两个不同的房间,无论是a房间的数据怎么发生变化,还是b房间的数据发生了变化,相互之间都不会受到任何影响。

这个就是copy函数和2次赋值在功能上的区别。

# coding:utf-8

a = [1,2,3]
b = a.copy()
b.append(4)
print(b)
print(a)

运行结果:

/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py 
[1, 2, 3, 4]
[1, 2, 3]

进程已结束,退出代码为 0
  • 3)copy在功能上属于浅拷贝。

浅拷贝: 通俗的说,我们有一个列表a,列表里的元素还是列表,当我们拷贝出新列表b后,无论是a还是b的内部的列表中的数据发生了变化后,相互之间都会受到影响。

不像之前的例子一样,a和b无论发生变化,相互之间不会受到影响。因为它只是在第一层不会受到影响。但是如果列表中还有列表,它是属于一种深层次的数据。如果深层数据发生变化,那么相互之间还是会发生变化。

总结:只能对数据结构的第一层数据进行拷贝,如果数据结构里有更深层的数据,则无法进行拷贝。深层数据,原始变量和新变量是共享的。发生变化也是共享的。这就是浅拷贝。

a = [[1,2,3],[5,6,7]]
b = a.copy()
print(b)
b[0].append(10)
print(b)
print(a)

运行结果:

/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py 
[[1, 2, 3], [5, 6, 7]]
[[1, 2, 3, 10], [5, 6, 7]]
[[1, 2, 3, 10], [5, 6, 7]]

进程已结束,退出代码为 0

深拷贝: 不仅对第一层数据进行了copy,对深层的数据也进行copy,原始变量和新变量完全不共享数据。

import copy

a = [[1,2,3],[4,5,6]]
b = copy.deepcopy(a)
print(b)
b[0].append(10)
print(b)
print(a)

运行结果:

/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py 
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3, 10], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]

进程已结束,退出代码为 0

4.代码

例1:

# coding:utf-8

old_list = ['python','django','flask']
new_list = old_list
new_list.append('tornado')
print(new_list)
print(old_list)
print(id(new_list),id(old_list))

old_list.remove('tornado')
print(new_list,old_list)

del new_list
print(old_list)

运行结果:

/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/list_copy.py 
['python', 'django', 'flask', 'tornado']
['python', 'django', 'flask', 'tornado']
4299404864 4299404864
['python', 'django', 'flask'] ['python', 'django', 'flask']
['python', 'django', 'flask']

进程已结束,退出代码为 0

说明:因为有两个变量都在共用一个内存地址,所以本次del只删除了变量名,并没有删除内存中的地址。过去只有一个变量名对应了这个内存地址,当我们删除了这个变量名,内存地址没有人使用,所以内存管家就把它清空了。

但是通过二次赋值的方式,使多个变量名都在使用同一个内存地址,所以仅仅删除一个变量名,还不会将这个内存地址彻底清除。

例2:

# coding:utf-8

old_list = ['python','django','flask']
new_list = old_list
new_list.append('tornado')
print(new_list)
print(old_list)
print(id(new_list),id(old_list))

old_list.remove('tornado')
print(new_list,old_list)

del new_list
print(old_list)

old_list_copy = ['python','django','flask']
new_list_copy = old_list_copy.copy()

print(old_list_copy,new_list_copy)
new_list_copy.append('tornado_copy')
print(old_list_copy,new_list_copy)
print(id(old_list_copy),id(new_list_copy))

运行结果:

/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/list_copy.py 
['python', 'django', 'flask', 'tornado']
['python', 'django', 'flask', 'tornado']
4339742336 4339742336
['python', 'django', 'flask'] ['python', 'django', 'flask']
['python', 'django', 'flask']
['python', 'django', 'flask'] ['python', 'django', 'flask']
['python', 'django', 'flask'] ['python', 'django', 'flask', 'tornado_copy']
4339719360 4340597760

进程已结束,退出代码为 0

http://www.kler.cn/news/342275.html

相关文章:

  • Java第二阶段---13抽象类和接口---第二节 接口
  • 《网络基础之 HTTP 协议:深入理解请求与响应结构》
  • Leetcode 206.反转链表
  • Spring Boot洗衣店订单系统:提升服务质量
  • Python--解决从Hugging Face的服务器下载某个预训练模型或其相关的文件问题
  • 第四范式发布全新一代文档数字化管理平台Smart Archive 2.0
  • 嵌入式硬件设计详解
  • 通过redis实现高性能计费处理逻辑
  • YOLOv10改进策略【注意力机制篇】| 引入MobileNetv4中的Mobile MQA,提高模型效率
  • Spring Boot洗衣店订单系统:客户体验升级
  • Qt C++设计模式->备忘录模式
  • 超材料受限需突破,水凝胶助力可重构,加密应用显神通
  • 微服务概述
  • 微软最新 Office 办公软件2025下载 – Microsoft 365 正版优惠订阅
  • 安全网络架构
  • linux查看k8s的开机启动状态 systemctl is-enabled 查看开机启动状态
  • JS 怎么监听复制事件 并获取复制内容 并修改复制文本内容
  • Django-rest-framework(DRF)怎么使用redis
  • 洗衣店订单管理:Spring Boot系统创新
  • Java | Leetcode Java题解之第472题连接词