Python札记8_深入理解赋值和深、浅拷贝(更新)

作者: 皮皮大 | 来源:发表于2019-06-18 14:38 被阅读1次

Python中有一个很特殊的现象:深浅拷贝,看到一些面经里面很多面试都会考到这个知识点,将笔者自己的理解整理如下

深浅拷贝

  • 浅拷贝:copy(),拷贝第一层

  • 深拷贝:deepcopy(),拷贝所有数据(可变);存在嵌套时,才和浅拷贝有区别

对于字符串str、整数型int、布尔值bool三种不可变的对象类型,深浅拷贝是一样的,直接在内存中直接开辟空间进行存储。

对于列表list、集合set、字典dict:

单层列表

V1 = [1, 2, 3]
V2 = copy.copy(V1)
V3 = copy.deepcopy(V1)   # 找到所有的可变数据类型进行拷贝;V1中只有列表是可变,其中的int类型是不可变的;所以V2和V3相同
print(V2, V3)

[1, 2, 3] [1, 2, 3]
V1 = "xiaoming"
V2 = copy.copy(V1)       
print(id(V1), id(V2))    # 内存地址本应该不同,但结果中却是相同,是由于小数据池的缘故;因为列表是不可变的对象类型
V3 = copy.deepcopy(V1)   
print(id(V1), id(V3))    # 原理同上 
V1 = [1, 2, [3, 4]]
V2 = copy.copy(V1)
print(id(V1), id(V2))    # 内存地址不同,列表是可变数据类型
V3 = copy.deepcopy(V1)   # 存在嵌套:浅拷贝只拷贝第一层,深拷贝里面的所有数据进行拷贝
print(id(V1), id(V3))    # 内存地址不同
V1 = [1, 2, [3, 4]]
V2 = copy.copy(V1)
print(id(V1), id(V2))    # 浅拷贝只拷贝第一层,内存地址不同;
print(id(V1[2]), id(V2[2]))  # 第二层的地址是相同的
V3 = copy.deepcopy(V1)   # 存在嵌套:浅拷贝只拷贝第一层,深拷贝里面的所有数据进行拷贝
print(id(V1), id(V3))    # 内存地址不同
print(id(V1[2]), id(V3[2]))  # 在深拷贝中,第二层的地址也是不同的

相关文章

  • Python札记8_深入理解赋值和深、浅拷贝(更新)

    Python中有一个很特殊的现象:深浅拷贝,看到一些面经里面很多面试都会考到这个知识点,将笔者自己的理解整理如下 ...

  • 简介深浅拷贝

    深浅拷贝 python 直接赋值,浅拷贝和深拷贝 直接赋值 其实就是对象的引用 (可以理解成浅拷贝) 浅拷贝: 拷...

  • Python中的引用赋值,深拷贝,浅拷贝

    摘要:Python,引用赋值,深拷贝,浅拷贝 总结一下Python中的变量的引用赋值,深拷贝和浅拷贝,先上结论 赋...

  • Python底层|赋值 浅拷贝 深拷贝

    参考 python中的深拷贝和浅拷贝问题python的复制,深拷贝和浅拷贝的区别 结论 总体来说,赋值只是增加了一...

  • 深拷贝 浅拷贝

    深入认识深拷贝 浅拷贝 公共方法 // 深拷贝 浅拷贝 对于基本类型来说 对于赋值操作 就是 深拷贝 因为值...

  • 赋值 浅拷贝 深拷贝

    赋值、浅拷贝、深拷贝赋值就是完全引用原来的对象通俗的理解,浅就是外面,深就是里面。浅拷贝的意思就是只拷贝外面的一层...

  • python深拷贝和浅拷贝详解

    对于python来说,有两种拷贝类型,浅拷贝和深拷贝 但要注意的是= 不是浅拷贝也不是深拷贝,赋值是新建了一个引用...

  • python赋值、浅拷贝和深拷贝

    简介   python中关于对象复制有三种类型:直接赋值、浅拷贝和深拷贝,他们既有联系又有区别。在python中,...

  • python的浅拷贝和深拷贝

    对于不可变类型,浅拷贝和深拷贝没有区别 对于不可变类型 赋值 浅拷贝 深拷贝

  • Python中的赋值及深浅拷贝

    Python中的赋值及深浅拷贝 赋值 示例 打印 浅拷贝 示例 打印 深拷贝 示例 打印 三层列表演示 示例 打印

网友评论

    本文标题:Python札记8_深入理解赋值和深、浅拷贝(更新)

    本文链接:https://www.haomeiwen.com/subject/yvixqctx.html