Python中的深浅拷贝
2016-12-13 14:29
295 查看
1.什么是深浅拷贝?
python中一切皆对象,python中的数字、字符串、元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的内存空间是可以被修改的。
下面我们定义一个列表:
list=[1,2,3,4,5]
list1=list
list[0]=6
>>>list
[6,2,3,4,5]
>>>list1
[6,2,3,4,5]
如果我们只想改变list,问题就出现了。
赋值操作 list1 = list,是浅拷贝,当list的值改变的时候,list1的值跟着改变。
2.用for和[:]实现浅拷贝
list = [1,2,3,4,5]
list2= [ i for i in list] //list2=list[:]
list2[-1]=0
>>> list
>>> list2
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 0]
上面的例子,用for循环生成新的list2对象或者[:]切片赋值得到的list2,当改变list2的值时,list的值没有跟着改变,这就是深拷贝吗?且继续往下看:
3.
list = [1, 2, 3, [1,2009] ]
list3 = [ i for i in list] //list2=list[:]
list3[-1].append(2009)
>>> list
>>> list3
[1, 2, 3, [1, 2009, 2009]]
[1, 2, 3, [1, 2009, 2009]]
3 和 2难道有矛盾?不。
解释:for循环操作的时候,把list中的每一个对象的引用拷贝,而list中的前3个元素是字符串对象,在python中,字符串对象赋值操作是:变量指向存放字符串的地址,所以看起来好像是深拷贝,实际上还是浅拷贝,若不信,请继续往下看:
4
for i in list:
print id(i)
3630168
3630156
3630144
46784880
for i in list3:
print id(i)
3630168
3630156
3630144
46784880
那么,在pyhton,深拷贝在哪呢?不急,下面就是了
5.
import copy
list= [1, 2, 3, [1,2009] ]
list5 = copy.deepcopy(list)
>>> list
[1, 2, 3, [1, 2009]]
>>> list5
[1, 2, 3, [1, 2009]]
list5[-1].append(2009)
>>> list5
[1, 2, 3, [1, 2009, 2009]]
>>> list
[1, 2, 3, [1, 2009]]
6.总结:
浅拷贝不会拷贝数据中的子对象。
例如:for ,切片浅拷贝,impord copy copy.copy
深拷贝会拷贝数据中的子对象
例如:impord copy.deepcopy
python中一切皆对象,python中的数字、字符串、元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的内存空间是可以被修改的。
下面我们定义一个列表:
list=[1,2,3,4,5]
list1=list
list[0]=6
>>>list
[6,2,3,4,5]
>>>list1
[6,2,3,4,5]
如果我们只想改变list,问题就出现了。
赋值操作 list1 = list,是浅拷贝,当list的值改变的时候,list1的值跟着改变。
2.用for和[:]实现浅拷贝
list = [1,2,3,4,5]
list2= [ i for i in list] //list2=list[:]
list2[-1]=0
>>> list
>>> list2
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 0]
上面的例子,用for循环生成新的list2对象或者[:]切片赋值得到的list2,当改变list2的值时,list的值没有跟着改变,这就是深拷贝吗?且继续往下看:
3.
list = [1, 2, 3, [1,2009] ]
list3 = [ i for i in list] //list2=list[:]
list3[-1].append(2009)
>>> list
>>> list3
[1, 2, 3, [1, 2009, 2009]]
[1, 2, 3, [1, 2009, 2009]]
3 和 2难道有矛盾?不。
解释:for循环操作的时候,把list中的每一个对象的引用拷贝,而list中的前3个元素是字符串对象,在python中,字符串对象赋值操作是:变量指向存放字符串的地址,所以看起来好像是深拷贝,实际上还是浅拷贝,若不信,请继续往下看:
4
for i in list:
print id(i)
3630168
3630156
3630144
46784880
for i in list3:
print id(i)
3630168
3630156
3630144
46784880
那么,在pyhton,深拷贝在哪呢?不急,下面就是了
5.
import copy
list= [1, 2, 3, [1,2009] ]
list5 = copy.deepcopy(list)
>>> list
[1, 2, 3, [1, 2009]]
>>> list5
[1, 2, 3, [1, 2009]]
list5[-1].append(2009)
>>> list5
[1, 2, 3, [1, 2009, 2009]]
>>> list
[1, 2, 3, [1, 2009]]
6.总结:
浅拷贝不会拷贝数据中的子对象。
例如:for ,切片浅拷贝,impord copy copy.copy
深拷贝会拷贝数据中的子对象
例如:impord copy.deepcopy
相关文章推荐
- C++与Python的深浅拷贝比较
- Python中的深浅拷贝详解
- python 深浅拷贝
- Python之赋值与深浅拷贝
- [Python笔记]第三篇:深浅拷贝、函数
- Core Python Programming一书中关于深浅拷贝的错误
- Python开发【第二章】:深浅拷贝剖析
- python 赋值、深浅拷贝、作用域
- 【Python】Python中的深浅拷贝
- python深浅拷贝探究
- Python之深浅拷贝
- python 深浅拷贝
- python小白-day3 深浅拷贝
- Python-Day3知识点——深浅拷贝、函数基本定义、内置函数
- 3.python基础补充(集合,collection系列,深浅拷贝)
- Python中的深浅拷贝详解
- python 深浅拷贝
- python基础系列(三)---set、collection、深浅拷贝
- Python全栈开发之3、数据类型set补充、深浅拷贝与函数
- python——赋值与深浅拷贝