东莞免费建网站企业,创意广告图片及文字解析,linux wordpress路径,wordpress菜单栏不显示不出来Python中关于对象复制有三种类型的使用方式#xff0c;赋值、浅拷贝与深拷贝。他们既有区别又有联系#xff0c;刚好最近碰到这一类的问题#xff0c;研究下。
一、赋值
在python中#xff0c;对象的赋值就是简单的对象引用#xff0c;这点和C不同。如下#xff1a;
a […Python中关于对象复制有三种类型的使用方式赋值、浅拷贝与深拷贝。他们既有区别又有联系刚好最近碰到这一类的问题研究下。
一、赋值
在python中对象的赋值就是简单的对象引用这点和C不同。如下
a [1,2,3,hello,[python,C]]
b a
print ab #True
这种情况下b和a是一样的他们指向同一片内存b不过是a的别名是引用。我们可以使用a与b是否相同来判断返回True表明他们地址相同内容相同。
赋值操作包括对象作为参数、返回值不会开辟新的内存空间它只是复制了新对象的引用。也就是说除了b这个名字以外没有其它的内存开销。
修改了a就影响了b同理修改了b就影响了a。
a [1,2,3,hello,[python,C]]
b a
b.append(ADD)
print a,a,b,b
#a[1, 2, 3, hello, [python, C], ADD] b[1, 2, 3, hello, [python, C], ADD]
二、浅拷贝shallow copy
浅拷贝会创建新对象其内容是原对象的引用。
浅拷贝有三种形式切片操作工厂函数copy模块中的copy函数。
比如对上述a
1、切片操作b a[:] 或者 b [each for each in a]
2、工厂函数b list(a)
3、copy函数b copy.copy(a)
浅拷贝产生的b不再是a了使用is可以发现他们不是同一个对象使用id查看发现它们也不指向同一片内存。但是当我们使用 id(x) for x in a 和 id(x) for x in b 时可以看到二者包含的元素的地址是相同的。
在这种情况下a和b是不同的对象修改b理论上不会影响a。比如b.append([4,5])。
a [1,2,3,hello,[python,C]]
b a[:]
b.append(ADD)
print a,a,b,b
#a [1, 2, 3, hello, [python, C]] b [1, 2, 3, hello, [python, C], ADD]
但是要注意浅拷贝之所以称为浅拷贝是它仅仅只拷贝了一层在a中有一个嵌套的list如果我们修改了它情况就不一样了。
a[4].append(C)。查看b你将发现b也发生了变化。这是因为你修改了嵌套的list。修改外层元素会修改它的引用让它们指向别的位置修改嵌套列表中的元素列表的地址并为发生变化指向的都是同一个位置。
三、深拷贝deep copy
深拷贝只有一种形式copy模块中的deepcopy函数。
和浅拷贝对应深拷贝拷贝了对象的所有元素包括多层嵌套的元素。因而它的时间和空间开销要高。
同样对la若使用b copy.deepcopy(a)再修改b将不会影响到a了。即使嵌套的列表具有更深的层次也不会产生任何影响因为深拷贝出来的对象根本就是一个全新的对象不再与原来的对象有任何关联。
四、关于拷贝操作的警告
1、对于非容器类型如数字字符以及其它“原子”类型没有拷贝一说。产生的都是原对象的引用。
2、如果元组变量值包含原子类型对象即使采用了深拷贝也只能得到浅拷贝。
以上这篇基于Python List的赋值方法就是小编分享给大家的全部内容了希望能给大家一个参考也希望大家多多支持脚本之家。