浅拷贝和深拷贝
Python中的:
引出思考的问题: 为什么下图中,修改a的值时候,b的值也会跟着一起修改?
Python中的各种数据类型(列表,元组等),实际上都是一个个对象,对象有方法(函数),属性(各种变量的值)
使用 = 这个符号的时候,操作是怎么进行的?
首先得知道,这些东西在内存中是如何存储的?
当a的指针指向了内存中的 1 区域,表示a这个变量是在内存中的 1 区域存储
执行 b = a 时候的操作:
只是将 b 的指针指向了和 a 的指针指向了的同一块区域,或者说将 a 的指针复制了一次,填充到了 b 中存放指针的那个区域
这就是浅拷贝 , 只是将指针进行了拷贝,指向了同一个内存区域,实际上没有将整个对象都复制,或者说创建一个新的对象,所以就会出现开头问题,修改 b 的值的时候,a 的值也会跟着一起修改,因为 a 和 b 指向的是同一个区域,所以,对 a 进行的操作会影响到 b ,对 b 进行的操作会影响到 a
如果我不想让这两个列表对象之间的修改相互影响到对方,要怎么操作呢?
将 a 对象完完整整的复制一次,而不是只将他的指针复制给 b 对象
像上述的这种操作,将 a 对象完完整整的复制一次给 b 对象,使得他们之间任何的操作之间不会产生相互的影响,完全变成相互独立的两个对象(浅拷贝的时候,两个对象之间的指针指向了同一块内存空间,仍然有一点联系),这就是深拷贝
怎么实现?(Python中)
使用 copy 模块里面的 deepcopy() 方法
在 Python 中,使用 copy 模块中的 deepcopy() 方法,可以将括号中的对象进行深拷贝,像上图中,深拷贝之后,a 和 b 之间的操作就相互独立,在 a 中添加的值,不会对 b 产生影响。
在 C++ 中如何实现类似的操作呢?
自定义构造函数,如果没有定义构造函数的话,编译器将默认生成一个默认构造函数,这个默认构造函数什么事情都不会做,相当于一个空白的函数