python基础(三)python中的赋值、浅拷贝和深拷贝

(一)赋值
  赋值无论对于可变数据类型(字典和列表)还是不可变数据类型(数值型、字符串、元组)它的本质都是对元数据换了一个引用也就是在内存中并未开辟新的内存空间来存放数据,只是新增了引用(新增了名字)。
python基础(三)python中的赋值、浅拷贝和深拷贝
结论:对不可变数据类型a和可变数据类型c,赋值操作仅仅是增加了引用方式,并未开辟新的内存空间来独立两个对象。

(二)浅拷贝
  2.1 不可变数据类型
python基础(三)python中的赋值、浅拷贝和深拷贝结论:对于不可变数据类型浅拷贝也并未将两个对象独立开,即不会申请额外的内存。

  2.2 可变数据类型
原理:如图所示可变数据类型浅拷贝原理python基础(三)python中的赋值、浅拷贝和深拷贝
python基础(三)python中的赋值、浅拷贝和深拷贝
结论:浅拷贝可变数据类型,它是将拷贝对象用额外的内存存放即拷贝数据和原始数据是两个独立的对象。对数据中非复杂数据的修改两者是相互独立的;对复杂数据的修改是不独立的,因为它们共享这个子对象,只要它们其中一个进行更改操作,另一个也会跟着变化。

(三)深拷贝
  3.1 不可变数据类型
python基础(三)python中的赋值、浅拷贝和深拷贝
结论:深拷贝不可变数据类型,这两个对象也不是互相独立的,不会新开辟内存。

  3.2 可变数据类型
原理:如图所示可变数据类型深拷贝原理
python基础(三)python中的赋值、浅拷贝和深拷贝
python基础(三)python中的赋值、浅拷贝和深拷贝
结论:深拷贝可变数据类型,是将两个对象完全隔离开了,互相独立,互不影响。

(四)结论
1.赋值操作无论是对于可变数据类型还是不可变数据类型,都不会开辟新的内存空间,两个对象不是互相独立的,共享一个内存空间;只是多了个新的引用,内存计数器加1。
2.浅拷贝不可变数据类型与赋值操作一样并不独立共享内存;浅拷贝可变数据类型是实现将原始数据和拷贝数据独立开来(但仅能做到将数据中的简单对象独立开,复杂对象无法实现独立是共享内存,所以你会看到更改复杂子对象只要其中一个变,另一个也会跟着变)。那么,此时就需要深拷贝来实现原数据与拷贝数据的完全独立了。
3.深拷贝不可变数据类型也是共享内存、不独立;深拷贝可变数据类型是完全的实现原始数据对象和拷贝数据对象的独立,由不同内存存放,互不干扰。

参考:
  菜鸟教程