python列表复制函数 python 复制函数( 二 )


当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象时,如(1, 2, ['hello','world'])
变量a与变量b指向的是不同的元组对象 , 同时a[2]与b[2]指向不同的列表对象,所以修改a[2][1]不会影响b[2][1]
使用=是赋值,即将列表对象的引用也赋值给变量b , 可以将列表对象想像成一个盒子,变量a相当于这个盒子上的标签,执行b = a后,相当于再在这个盒子上贴上b标签 , a和b实际上指向的是同一个对象 。因此,无论我们是通过a还是通过b来修改列表的内容,其结果都会作用于双方 。
b/c/d都是a的复制,它们都指向了不同的列表对象 , 但是没有拷贝子元素,a[2]和b[2]/c[2]/d[2]指向同一个列表, 相当于浅拷贝的效果
使用分片[:]操作,a和b其实是指向同一个元组 , 而且没有拷贝子元素,a[2]和b[2]也指向同一个列表,相当于浅拷贝的效果
同列表类似,可以使用字典的copy()函数或者转换函数dict()
变量a与变量b/c指向不同的字典,但是没有拷贝子元素,a['jobs']和b['jobs']/c['jobs']指定同一个列表,相当于浅拷贝的效果
同列表类似 , 可以使用集合的copy()函数或者转换函数set()
变量a与变量b/c指向不同的集合,而集合的元素必须是hashable,所以修改集合a不会影响到b/c
Python3 & 浅拷贝与深拷贝在Python中对象的赋值(=)其实就是对象的引用 。即:当创建一个对象,把它赋值给另一个变量时,python并没有拷贝这个对象 , 只是拷贝了这个对象的引用而已 。
Python中对象的拷贝分为:浅拷贝(copy)和深拷贝(deepcopy) 。
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已 。也就是,将原对象在内存中引用地址拷贝过来,然后让新的对象指向这个地址 。可以使用“=”或列表自带的copy()函数(如list.copy()),或使用copy模块的copy()函数 。
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用 。即把对象复制一遍,并且该对象中引用的其他对象也同时复制,完全得到一个新的一模一样的对象,对新对象里的值进行修改不会影响原有对象 , 新对象和原对象完全分离开 。深拷贝只能使用copy模块中deepcopy()函数,使用前要导入:from copy import deepcopy 。
Python中对象分为不可变对象 、可变对象 。
不可变对象:一旦创建就不可修改的对象,例如:字符串、元组、数字
可变对象:可以修改的对象 , 例如:列表、字典 。
其中Python中的切片可以应用于:列表、元组、字符串,但不能应用于字典 。
而深浅拷贝 , 可应用于序列(列表、元组、字符串),也可应用于字典 。
其中不可变对象,不管是深拷贝还是浅拷贝 , 地址值在拷贝后的值都是一样的 。
以下以元组(不可变类型)为例
从上述示例可以看出:
不可变对象类型,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已 。
所以不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的 。
以下以列表(可变类型)为例
第一种方法:使用=号浅拷贝
输出结果:
第二种方法:使用copy浅拷贝
输出结果:
第三种方法:使用deepcopy深拷贝
输出结果:
从上述示例可以看出:
=浅拷贝:值相等 , 地址相等
copy浅拷贝:值相等,地址不相等
deepcopy深拷贝:值相等,地址不相等

推荐阅读