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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清菡软件测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值