Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。

下面本文就通过简单的例子介绍一下这些概念之间的差别。

一、对象赋值

  又叫变量对对象的引用

li=["Will", 28, ["Python", "C#", "JavaScript"]]
new_li=li print(id(li)) #
print([id(ele) for ele in li]) #[1369692104328, 1511377424, 1369692110600] print(id(new_li)) #
print([id(ele) for ele in new_li]) #[1369692104328, 1511377424, 1369692110600]

  可以看出li赋值给了new_li,同时,new_li是引用了li的内存地址

  当对数据做修改的操作时:

  1、经本人多次试验考证,发现对象赋值,不论多么复杂的数据结构,你对任意数据做了修改之后,都会影响到另一个

  2、而且,若数据为可变数据类型,修改数据后,内存地址都不会变

  3、若为不可变数据类型,修改数据后,会替换掉旧的对象,即内存地址会发生改变 

li=["Will", 28, ["Python", "C#", "JavaScript"]]
new_li=li print([id(ele) for ele in li]) #[1925751432840, 1511377424, 1925751446472] li[0] = "Wilber"
li[1] = 22
li[2].append("CSS") print ([id(ele) for ele in li]) #[1925751447768, 1511377232, 1925751446472]

二、浅拷贝

import copy
li=["Will", 28, ["Python", "C#", "JavaScript",[
{'mm':1},
{'mm':2},
{1,2,3}
]]]
new_li=copy.copy(li) print([id(ele) for ele in li]) #[1474180867888, 1511377424, 1474180874120]
print([id(ele) for ele in new_li]) #[1474180867888, 1511377424, 1474180874120] new_li[0] = "Wilber"
new_li[1] = 22
new_li[2].append("CSS")
new_li[2][3][0]='xx'
new_li.append('sss') print (li) #['Will', 28, ['Python', 'C#', 'JavaScript', ['xx', {'mm': 2}, {1, 2, 3}], 'CSS']]
print ([id(ele) for ele in li]) #[1474180867888, 1511377424, 1474180874120] print (new_li) #['Wilber', 22, ['Python', 'C#', 'JavaScript', ['xx', {'mm': 2}, {1, 2, 3}], 'CSS'], 'sss']
print ([id(ele) for ele in new_li]) #[1474180883040, 1511377232, 1474180874120]

  可以看出浅拷贝只拷贝了最外面一层的数据,当对最外面一层做改动时,不会影响到另一个,但是对套在里面的数据做改动就会影响到另外一个。

  注:切片的效果和浅拷贝一样

三、深拷贝

import copy
li=["Will", 28, ["Python", "C#", "JavaScript",[
{'mm':1},
{'mm':2},
{1,2,3}
]]]
new_li=copy.deepcopy(li) print([id(ele) for ele in li]) #[1609895241352, 1511377424, 1609895247752]
print([id(ele) for ele in new_li]) #1609895241352, 1511377424, 1609895247816] new_li[0] = "Wilber"
new_li[1] = 22
new_li[2].append("CSS")
new_li[2][3][0]='xx'
new_li.append('sss') print (li) #['Will', 22, ['Python', 'C#', 'JavaScript', [{'mm': 1}, {'mm': 2}, {1, 2, 3}]]]
print ([id(ele) for ele in li]) #[1609895241352, 1511377232, 1609895247752] print (new_li) #['Wilber', 28, ['Python', 'C#', 'JavaScript', ['xx', {'mm': 2}, {1, 2, 3}], 'CSS'], 'sss']
print ([id(ele) for ele in new_li]) #[1609895256448, 1511377424, 1609895247816, 1609895256728]

  会发现深拷贝对每一层数据都做了拷贝,即对任一数据做了改动,都不会影响到另一个。

四、总结

  1、对象赋值是对对象内存地址的引用,它代表原始对象,所以不论对哪一个做了改动,都会影响到另外一个

  2、copy.copy()浅拷贝,只对第一层元素进行拷贝

  3、若想复制一个容器对象及里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝

  4、对于非容器类型(如数字、字符串、等不可变类型的对象)没有被拷贝一说

 

python深浅拷贝问题的更多相关文章

  1. Python开发【第二章】:Python深浅拷贝剖析

    Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...

  2. 小学生都能学会的python(深浅拷贝)

    小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...

  3. 【0806 | Day 9】三张图带你了解数据类型分类和Python深浅拷贝

    一.数据类型分类 二.Python深浅拷贝

  4. 底层剖析Python深浅拷贝

    底层剖析Python深浅拷贝 拷贝的用途 拷贝就是copy,目的在于复制出一份一模一样的数据.使用相同的算法对于产生的数据有多种截然不同的用途时就可以使用copy技术,将copy出的各种副本去做各种不 ...

  5. 关于python深浅拷贝的个人浅见

    起初,关于python的深浅拷贝,总是习惯去用传值传址的方式去考虑,发现总是get不到规律,容易记混. python有着高度自治的内存管理,而不可变对象的内存分配,则是能省则省,就是说,无论用什么拷贝 ...

  6. python深浅拷贝与赋值

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  7. python 深浅拷贝 进阶

    主要理解新与旧究竟在哪里 这样也就理解了 深浅拷贝 先说说赋值,事实上python中的赋值事实上是赋值了一个引用.比如: foo1=1.0 foo2=foo1 用操作符is推断时.你能够发现结果是tr ...

  8. python深浅拷贝&垃圾回收&上下文管理(with语句)

    深浅拷贝 在Python中使用copy模块用于对象的拷贝操作. 该模块提供了两个主要的方法:浅拷贝 copy.copy() 深拷贝 copy.deepcopy() 1.浅拷贝(copy) 浅拷贝: 不 ...

  9. 关于Python深浅拷贝

    拷贝: 说明:原则上就是把数据分离出来,复制其数据,并以后修改互不影响. 何来深浅拷贝的说法? 深浅拷贝的“深”和“浅”可以理解为从变量到硬盘上的物理存储介质之间的层次的多少. 下面用一个示例来解释浅 ...

  10. python 深浅拷贝 for循环删除

    ###########################总结########################### 1. 基础数据类型补充 大多数的基本数据类型的知识.已经学完了 a='aaaa' ls ...

随机推荐

  1. 上传图片时压缩图片 - 前端(canvas)做法

    HTML前端代码: <?php $this->layout('head'); ?> <?php $this->layout('sidebar'); ?> <m ...

  2. Kafka入门之生产者消费者测试

    目录: kafka启动脚本以及关闭脚本 1. 同一个生产者同一个Topic,两个相同的消费者相同的Group 2. 同一个生产者同一个Topic,两个消费者不同Group 3. 两个生产者同一个Top ...

  3. java mysql编码问题

    今天使用jdbc连接数据库,sql语句明明是正确的,可就是查不到数据,问题是编码问题,好大的坑啊!!! 我的问题:where语句带汉字找不到信息,如果是英文却可以 第一步:在url后面加上如下的utf ...

  4. 1.1-1.4 sqoop概述及安装cdh版hadoop

    一.概述 Sqoop是一个在结构化数据和Hadoop之间进行批量数据迁移的工具,结构化数据可以是Mysql.Oracle等RDBMS. Sqoop底层用MapReduce程序实现抽取.转换.加载,Ma ...

  5. 3.19 YARN HA架构及(RM/NM) Restart讲解

    一.ResourceManager HA ResourceManager(RM)负责跟踪集群中的资源,以及调度应用程序(例如,MapReduce作业). 在Hadoop 2.4之前,ResourceM ...

  6. 【剑指Offer学习】【面试题66:矩阵中的路径】

    题目:请设计一个函数,用来推断在一个矩阵中是否存在一条包括某字符串全部字符的路径.路径能够从矩阵中随意一格開始.每一步能够在矩阵中间向左.右.上.下移动一格.假设一条路径经过了矩阵的某一格,那么该路径 ...

  7. UVa 1412 Fund Management (预处理+状压DP)

    题意:题意很难说清楚自己看原文,链接:UVa 1412 Fund Management 析:总体来说如果没有超时的话,这个题不是特别难,但是这个题很容易超时,主要是体现在状态转移时,很容易想到状态方程 ...

  8. Linux which 查找命令

    在学习 兄弟连 linux教学视频 的时候,我将所学的 linux 命令记录在我的博客中,方便自己查阅. 权限管理命令: which 基础的命令 命令名称:which 命令的所在路径:/usr/bin ...

  9. Fitnesse + Xebium环境搭建

    1.在搭建Fitnesse + Xebium环境之前先将selenium基础环境搭建完成并调试成功 参照:http://www.cnblogs.com/moonpool/p/5480724.html ...

  10. 割点(Tarjan算法)

    本文可转载,转载请注明出处:www.cnblogs.com/collectionne/p/6847240.html .本文未完,如果不在博客园(cnblogs)发现此文章,请访问以上链接查看最新文章. ...