前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >python全栈开发《42.列表的copy函数(深浅拷贝区别)》

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

作者头像
清菡
发布2024-10-15 18:49:11
发布2024-10-15 18:49:11
7800
代码可运行
举报
文章被收录于专栏:清菡软件测试清菡软件测试
运行总次数:0
代码可运行

1.copy的功能

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

2.copy的用法

代码语言:javascript
代码运行次数:0
复制
old_list = ['a','b','c']
new_list = old_list.copy()
print(new_list)

运行结果:

代码语言:javascript
代码运行次数:0
复制
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/python_list/bin/python /Users/llq/PycharmProjects/pythonlearn/python_list/1.py 
['a', 'b', 'c']

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

3.copy与2次赋值的区别

二次赋值:
代码语言:javascript
代码运行次数:0
复制
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次赋值在功能上的区别。

代码语言:javascript
代码运行次数:0
复制
# coding:utf-8

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

运行结果:

代码语言:javascript
代码运行次数:0
复制
/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无论发生变化,相互之间不会受到影响。因为它只是在第一层不会受到影响。但是如果列表中还有列表,它是属于一种深层次的数据。如果深层数据发生变化,那么相互之间还是会发生变化。

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

代码语言:javascript
代码运行次数:0
复制
a = [[1,2,3],[5,6,7]]
b = a.copy()
print(b)
b[0].append(10)
print(b)
print(a)

运行结果:

代码语言:javascript
代码运行次数:0
复制
/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,原始变量和新变量完全不共享数据。

代码语言:javascript
代码运行次数:0
复制
import copy

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

运行结果:

代码语言:javascript
代码运行次数:0
复制
/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:

代码语言:javascript
代码运行次数:0
复制
# 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)

运行结果:

代码语言:javascript
代码运行次数:0
复制
/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:

代码语言:javascript
代码运行次数:0
复制
# 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))

运行结果:

代码语言:javascript
代码运行次数:0
复制
/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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.copy的功能
  • 2.copy的用法
  • 3.copy与2次赋值的区别
  • 4.代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档