天天看点

linux浅拷贝和深拷贝,关于 Python 深拷贝与浅拷贝

Python的数据结构总体分为两类:

1、字符串和数字

2、列表、元组、字典等

一、字符串和数字

对于字符串和数字而言,赋值(=)、浅拷贝(copy)和深拷贝(deepcopy)其实都没有意义,因为它们都永远指向同一个内存地址。

如图:

linux浅拷贝和深拷贝,关于 Python 深拷贝与浅拷贝

二、列表、元组、字典等

对于列表、字典而言,进行赋值(=)、浅拷贝(copy)和深拷贝(deepcopy),其引起的变化是不一样的。

2.1、赋值(=)

如图:

linux浅拷贝和深拷贝,关于 Python 深拷贝与浅拷贝

这和字符串和数字是不一样的,当我们定义 a =1 ,b = a ,改变a时,b是不会有变化的。列表和字典等会跟着变化,因为他们的内存地址是一样的。

2.2、浅拷贝(copy)

我们接下来看:

我们通过打印的内存地址可以明显看出,整个外层列表的内存地址是不一样的,但是里层的列表内存地址是一致的。

如图:

linux浅拷贝和深拷贝,关于 Python 深拷贝与浅拷贝

总结:浅拷贝(copy.copy(x))只是将列表等数据类型的第一层copy了一下,内存地址改变了。但是对于里层的数据类型的内存地址没有改变。

2.3、深拷贝(deepcopy)

深拷贝(copy.deepcopy(x))其实就是重新开辟了一个新的内存地址,存储deepcopy后的数据,和原来数据的内存地址完全不一样了,包括里层数据类型的内存地址。

如图:

linux浅拷贝和深拷贝,关于 Python 深拷贝与浅拷贝
linux浅拷贝和深拷贝,关于 Python 深拷贝与浅拷贝