python中的赋值与拷贝详解
python中的赋值与拷贝有什么区别呢?我们今天来仔细的分析一下。我们常用”=“操作符实现赋值操作。python中的拷贝可以通过copy这个module来实现。在讲赋值和拷贝之前,我们先来讲一下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]
深拷贝的变量不再受原对象变化的影响。因为深拷贝生成的新对象不再引用,而是直接将原对象内的元素递归的复制到自己的存储空间内,因此称之为深拷贝。
上一篇: vue实现鼠标经过显示悬浮框效果
下一篇: css实现悬浮客服效果