欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python中的赋值与拷贝详解

程序员文章站 2022-05-29 10:48:36
...

python中的赋值与拷贝有什么区别呢?我们今天来仔细的分析一下。我们常用”=“操作符实现赋值操作。python中的拷贝可以通过copy这个module来实现。在讲赋值和拷贝之前,我们先来讲一下python对象在内存中的存储。在python中,变量存储的并不是变量自身的值,而是变量自身值所在的地址。如下图所示。
python中的赋值与拷贝详解

赋值

list_a = [1,2,3,4]
list_b = list_a
list_a.append(5)
print(list_a)
print(list_b)

输出结果如下所示

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

我们可以看到,我们只修改了list_a,但是list_b的值也跟着变了,这是因为在赋值的过程中,只产生了一个变量list_b,但是该变量的地址与list_a中的地址相同,即指向同一个对象。

浅拷贝

我们可以通过python中的copy.copy()函数实现浅拷贝。举例如下

import copy
list_a = [[1,2],1,2,3,4]
list_b = copy.copy(list_a)
list_a[0].append(3)
list_a.append(5)
print(list_a)
print(list_b)

输出结果

[[1, 2, 3], 1, 2, 3, 4, 5]
[[1, 2, 3], 1, 2, 3, 4]

通过这个例子我们发现,当执行完浅拷贝后,再对list_a进行修改,对list_a新增元素5,并不会改变list_b对象,但是当我们对list_a中的元素进行修改时,即对list_a中的子元素列表增加新元素时,list_b也发生了改变。这是因为浅拷贝与赋值不同,浅拷贝创建了一个新的对象,变量list_b中的地址指向这个新的对象,这个新对象里面是对list_a中子元素的引用,即只拷贝了一层,因此,被称为浅拷贝。赋值是对对象的引用,而浅拷贝则是对对象内子元素的引用。

深拷贝

由于浅拷贝得到的变量,其中的值可能会随原对象的变化而变化,有时会带来不必要的麻烦,因此,我们又用到了深拷贝,深拷贝可用copy.deepcopy()函数实现。例子如下

import copy
list_a = [[1,2],1,2,3,4]
list_b = copy.deepcopy(list_a)
list_a[0].append(3)
list_a.append(5)
print(list_a)
print(list_b)

输出结果

[[1, 2, 3], 1, 2, 3, 4, 5]
[[1, 2], 1, 2, 3, 4]

深拷贝的变量不再受原对象变化的影响。因为深拷贝生成的新对象不再引用,而是直接将原对象内的元素递归的复制到自己的存储空间内,因此称之为深拷贝。