浅述python中深浅拷贝原理

 更新时间:2018年09月18日 08:52:56   作者:刺激乐天派  
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果,其实这个是由于共享内存导致的结果,下面我们来简单谈下Python中的深拷贝和浅拷贝。

前言

在c++中参数传递有两种形式:值传递和引用传递。这两种方式的区别我不在此说,自行补上,如果你不知道的话。我先上python代码,看完我们总结一下,代码如下:

# copy module import
import copy

# number and string
a = 12
a1 = a
a2 = copy.copy(a)
a3 = copy.deepcopy(a)
# look addr
print("==========number=======")
print(id(a))
print(id(a1))
print(id(a2))
print(id(a3))

s = '12345'
s1 = s
s2 = copy.copy(s)
s3 = copy.deepcopy(s)
# look addr
print("==========String=======")
print(id(s))
print(id(s1))
print(id(s2))
print(id(s3))

# others
target = {
  'name': 'ckmike',
  'age': 25,
  'boxes':[
    'LV',
    'Prada',
    'KUQI'
  ]
}
target1 = target
target2 = copy.copy(target)
target3 = copy.deepcopy(target)
print("==========dict-1=======")
print(id(target))
print(id(target1))
print(id(target2))
print(id(target3))
print("==========dict-2=======")
print(id(target['boxes']))
print(id(target1['boxes']))
print(id(target2['boxes']))
print(id(target3['boxes']))

输出结果:

==========number=======
10943360
10943360
10943360
10943360
==========String=======
140567123944648
140567123944648
140567123944648
140567123944648
==========dict-1=======
140567124625088
140567124625088
140567124625160
140567123938760
==========dict-2=======
140567099339272
140567099339272
140567099339272
140567099339464

总结:

对于数值、字符串而言,不管是赋值符号还是浅拷贝、深拷贝,都是引用的内存中的同一份值,变量指向同一地址。
对于非数值非字符串而言,浅拷贝只会拷贝对象的第一层,深拷贝则会把所有层都进行拷贝。

相关文章

  • 一文搞懂Python中pandas透视表pivot_table功能

    一文搞懂Python中pandas透视表pivot_table功能

    透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table,今天通过本文给大家介绍Python中pandas透视表pivot_table功能,感兴趣的朋友一起看看吧
    2021-11-11
  • Python利用networkx画图绘制Les Misérables人物关系

    Python利用networkx画图绘制Les Misérables人物关系

    这篇文章主要为大家介绍了Python利用networkx画图处理绘制Les Misérables悲惨世界里的人物关系图,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python中array数组添加一行或一列数据的具体实现

    python中array数组添加一行或一列数据的具体实现

    这篇文章主要给大家介绍了关于python中array数组添加一行或一列数据的具体实现,最近经常使用到数组方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 解决django model修改添加字段报错的问题

    解决django model修改添加字段报错的问题

    今天小编就为大家分享一篇解决django model修改添加字段报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python基于stuck实现scoket文件传输

    Python基于stuck实现scoket文件传输

    这篇文章主要介绍了Python基于stuck实现scoket文件传输,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用Python的pygame库实现下雪效果的示例代码

    使用Python的pygame库实现下雪效果的示例代码

    这篇文章给大家介绍了如何使用Python的pygame库实现下雪的效果,文中通过代码示例介绍的非常详细,对大家的学习或工作有一定的的帮助,需要的朋友可以参考下
    2024-01-01
  • Python中的urllib库高级用法教程

    Python中的urllib库高级用法教程

    这篇文章主要介绍了Python中的urllib库高级用法教程,想要请求需要设置一些请求头,如果要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现了,比如要增加一个 User-Agent ,增加一个 Referer 头信息等,需要的朋友可以参考下
    2023-10-10
  • Python实现比较两个文件夹中代码变化的方法

    Python实现比较两个文件夹中代码变化的方法

    这篇文章主要介绍了Python实现比较两个文件夹中代码变化的方法,实例分析了Python读取文件夹中文件及字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Python英文文本分词(无空格)模块wordninja的使用实例

    Python英文文本分词(无空格)模块wordninja的使用实例

    今天小编就为大家分享一篇关于Python英文文本分词(无空格)模块wordninja的使用实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Windows下Anaconda安装、换源与更新的方法

    Windows下Anaconda安装、换源与更新的方法

    这篇文章主要介绍了Windows下Anaconda安装、换源与更新的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论