码迷,mamicode.com
首页 > 其他好文 > 详细

深拷贝、浅拷贝

时间:2020-07-19 00:44:58      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:解决   答案   地址   并且   div   下标   二次   模块   pytho   

问题处理:

  • 需要把 :a = [1,1,2,3,4,5,1,4,5,6,8,9],里面的级数全部删除
a = [1,1,2,3,4,5,1,4,5,6,8,9]
for i in a:
    if i % 2 !=0:
        a.remove(i)
print(a)  #循环删list会导致下标错乱

结果:[1, 2, 4, 1, 4, 6, 8]

我们发现,取值的值并不对,1并不是偶数,并没有删除,因循环是以取下标的方式删除的,第二次循环是下标为0的就会跳过,因为第一次已经循环过了,第二次就会以下标为1的进行循环

所以,我们可以使用两个同样的list,这样会解决此问题,可以不用考虑到下标错乱,因为是每次都是依次循环的

a = [1,1,2,3,4,5,1,4,5,6,8,9]
a2 = [1,1,2,3,4,5,1,4,5,6,8,9]

for i in a2:
    if i % 2 !=0:
        a.remove(i)
print(a) 

结果:[2, 4, 4, 6, 8]

浅拷贝:

a = [1,1,2,3,4,5,1,4,5,6,8,9]
a2 = a
print(a的ID:,id(a))
print(a2的ID:,id(a2))

for i in a2:
    if i % 2 !=0:
        a.remove(i)
print(a)

结果:
a的ID: 18230152
a2的ID: 18230152
[1, 2, 4, 1, 4, 6, 8] 

我们发现,结果还是不对的,因为 a2 = a,是把 a 的值赋值给了 a2,这个时候他们两个的内存地址还是一样的,删除的时候相当于还是删除的一个list,这种方式我们叫作【浅拷贝】。

深拷贝:

  • 我们需要需要使用到---copy模块里面的deepcopy

*只有 copy.deepcopy 在Python属于是深拷贝

import copy

a = [1,1,2,3,4,5,1,4,5,6,8,9]
a2 = copy.deepcopy(a)
print(a的ID:,id(a))
print(a2的ID:,id(a2))
for i in a2:
    if i % 2 !=0:
        a.remove(i)
print(a)

结果:
a的ID: 18515592
a2的ID: 18513992
[2, 4, 4, 6, 8]

 这时我们可以看到处理出的数据是对的,并且 a2 和 a 的ID已经不一样了,这种拷贝方式,我们叫作是【深拷贝】

巩固练习(一):

a = [1,1,2,3,4,5,1,4,5,6,8,9]
a2 = a.copy()
a3 = copy.copy(a)
a4 = copy.deepcopy(a)
print(a的ID:,id(a))
print(a2的ID:,id(a2))
print(a3的ID:,id(a3))
print(a4的ID:,id(a4))

结果:
a的ID: 18716680
a2的ID: 18714696
a3的ID: 18323208
a4的ID: 497943056

 我们可以看到上边的结果,每个结果的ID地址其实是不一样的,那这种是不是属于是深拷贝呢?答案是:不是的,只有copy.deepcopy()属于是深拷贝,dict.copy也是浅拷贝

巩固练习(二):

import copy
a = [12,2,3,4,{key:key1}]
a2 = a
a3 = copy.deepcopy(a)
a4 = a.copy()
a.pop(1)
a[-1][key1] = liangcailian
print(a2的结果:,a2)
print(a3的结果:,a3)
print(a4的结果:,a4)

结果:
a2的结果: [12, 3, 4, {key1: liangcailian, key: key1}]
a3的结果: [12, 2, 3, 4, {key: key1}]
a4的结果: [12, 2, 3, 4, {key1: liangcailian, key: key1}]

我们可以从结果中看出 a3 和 a4 的结果已经不一样了,所以说 除了copy.deepcopy()是深拷贝外,其他的拷贝方式都是浅拷贝,当数据是多维数据嵌套时,就会正常处理不了啦。

深拷贝、浅拷贝

标签:解决   答案   地址   并且   div   下标   二次   模块   pytho   

原文地址:https://www.cnblogs.com/brf-test/p/13337985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!