Python的复制,深拷贝和浅拷贝的区别

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

一般有三种方法,

alist=[1,2,3,[‘a‘,‘b‘]]

(1)直接赋值,传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变

>>> alist=[1,2,3,[‘a‘,‘b‘]]
>>> b=alist
>>> print b
[1, 2, 3, [‘a‘, ‘b‘]]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, [‘a‘, ‘b‘], 5]
[1, 2, 3, [‘a‘, ‘b‘], 5]

(2)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变

目前alist=[1, 2, 3, [‘a‘, ‘b‘], 5]

>>> import copy
>>> c=copy.copy(alist)
>>> print alist
[1, 2, 3, [‘a‘, ‘b‘], 5]
>>> print c
[1, 2, 3, [‘a‘, ‘b‘], 5]
>>> alist.append(6)
>>> print alist;print c
[1, 2, 3, [‘a‘, ‘b‘], 5, 6]
[1, 2, 3, [‘a‘, ‘b‘], 5]
>>> alist.append(‘Python‘)
>>> print alist;print c
[1, 2, 3, [‘a‘, ‘b‘], 5, 6, ‘Python‘]
[1, 2, 3, [‘a‘, ‘b‘], 5]
>>> alist[3]
[‘a‘, ‘b‘]
>>> alist[3].append(‘Python‘)
>>> print alist;print c
[1, 2, 3, [‘a‘, ‘b‘, ‘Python‘], 5, 6, ‘Python‘]
[1, 2, 3, [‘a‘, ‘b‘, ‘Python‘], 5]

alist子对象被改变了
(3)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

>>> import copy
>>> alist=[1,2,3,[‘a‘,‘b‘]]
>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, [‘a‘, ‘b‘]]
[1, 2, 3, [‘a‘, ‘b‘]]

发现始终没有改变

>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, [‘a‘, ‘b‘], 5]
[1, 2, 3, [‘a‘, ‘b‘]]

发现始终没有改变

>>> alist=[1,2,3,[‘a‘,‘b‘]]
>>> alist[3]
[‘a‘, ‘b‘]
>>> alist[3].append(‘Python‘)
>>> print alist;print d
[1, 2, 3, [‘a‘, ‘b‘, ‘Python‘]]
[1, 2, 3, [‘a‘, ‘b‘]]

发现始终没有改变

总结:

1. 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。

2. 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。

3. 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。

时间: 08-23

Python的复制,深拷贝和浅拷贝的区别的相关文章

Python中深拷贝与浅拷贝的区别

Python中深拷贝与浅拷贝的区别: 原创 2017年04月20日 16:58:35 标签: python / python两种拷贝 / 深拷贝浅拷贝 / 拷贝区别 1661 定义: 在Python中对象的赋值其实就是对象的引用.当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已. 浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已.也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制 深拷贝:外围和内部元素都进行了拷贝

Python 深拷贝和浅拷贝的区别

python的复制,深拷贝和浅拷贝的区别    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法,        alist=[1,2,3,["a","b"]] (1)直接赋值,传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变 >>> b=alist        >>> print b        

**Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/

JS中深拷贝与浅拷贝的区别,实现深拷贝的几种方法

JS中深拷贝与浅拷贝的区别,实现深拷贝的几种方法 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力. 此篇文章中也会简单阐述到栈堆,基本数据类型与引用数据类型,因为这些概念能更好的让你理解深拷贝与浅拷贝. 我们来举个浅拷贝例子: let a=[0,1,2,3,4], b=a; console.log(a===b); a[0]=1; console.log(a,b); 嗯?明明b复

深拷贝与浅拷贝的区别,实现深拷贝的几种方法

JS的基本数据类型 基本数据类型:String,Boolean,Number,Undefined,Null: 引用数据类型:Object(Array,Date,RegExp,Function): 浅拷贝 浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化. Object.assign. 扩展运算符 ... . Array.prototype.slice(). Array.prototype.concat() 等 深拷贝 深

python中的深拷贝和浅拷贝

1.深拷贝VS浅拷贝 python中的深拷贝和浅拷贝和java里面的概念是一样的, 所谓浅拷贝就是对引用的拷贝 (里面的数据不拷贝出来,其中的数据与原对象里面数据用的是相同的地址空间) 所谓深拷贝就是对对象的资源的拷贝 (里面的数据拷贝出来.深拷贝有自己的存储空间,有自己定义的数据,跟原对象一点关系也没有) 2.对赋值的认识: 赋值:将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ) 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空

Python中复制、深拷贝和浅拷贝的区别

深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都是浅拷贝,如果需要使用深拷贝,需要特别指定. 深拷贝是对原对象的"复制以及粘贴",其实就是在内存中重新开辟了一个新的内存空间来存放这一份数据,两个变量其实是两个不一样的变量,仅仅是数据值相同而已,对两个变量的操作不会相互影响. 浅拷贝(copy) 在Python中进行数据的浅拷贝时,如果此

python深拷贝和浅拷贝的区别

首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 深拷贝和浅拷贝需要注意的地方是可变元素的拷贝,在浅拷贝时:拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新

python深拷贝与浅拷贝的区别

可变对象:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值 不可变对象:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址 copy.copy:浅拷贝,只拷贝父对象,不会拷贝对象内部的子对象 copy.decopy:深拷贝,拷贝对象及其子对象 在浅拷贝时,拷贝出来的新

python学习系列--深拷贝和浅拷贝

概念 普通情下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用.把新的对象置于新的内存空间中,才是拷贝.在python中,深浅拷贝的区别实际上是拷贝的深度不同. 操作 常见的'='号就是一种拷贝方式.python在复制对象时实际上是调用copy模块的copy方法,即copy.copy().而使用deepcopy()函数操作就是深拷贝.对于字符串和数字来说,不管是深拷贝还是浅拷贝,都只是在原有内存地址上的新引用,所以是没有区别的.可