关于赋值与深浅复制

赋值

在python中,赋值语句是建立对象的引用,而不是复制对象,变量就像一个指针。例如

id函数获得的是对象的内存地址,如果两个对象内存地址一样,说明这两个对象是同一个对象,id(a) == id(b)就相当于a is b。

上述例子输出结果都一样,说明alist 和blist是一样的,指向相同的内存空间,blist是alist的一个引用。

赋值操作不会开辟新的内存地址空间,只是增加一个对象引用。由于指向的是同一片地址空间修改了alist,另一个也会改变。

 

浅拷贝

浅拷贝会产生新的对象,其内容是原内容的索引

浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy方法

clist 的每个元素都与alist的元素地址相同,clist的元素是alist的元素一个引用,但是clist的地址与alist不同,他们是两个不同的对象,因此修改clist理论上不会影响alist。

dlist更新了,但是alist并未更新。

但是浅拷贝之所以被称为浅拷贝,是因为它只拷贝了一层,如果list中嵌套有list,如果修改了嵌套的list情况将不一样。

输出是一样的,这是因为,修改了外层的元素会修改他的引用,让他们指向别的地址,但是修改嵌套列表中的元素,列表地址并未发生变化指向的还是同一位置。

 

深拷贝

深拷贝是在拷贝的基础之上,把嵌套的元素也改变了,因此他的时间和空间开销都要高,修改一个对象另一个对象并不会发生变化。

 

posted @ 2018-02-13 17:44  Guan_zi  阅读(193)  评论(0编辑  收藏  举报