Colin is daily life record

导航

深拷贝与浅拷贝

在深入了解深浅拷贝前,我们需要了解一下 变量 引用 对象

变量和对象的关系

变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针

  • 对象
    • 是计算机分配的一块内存,需要足够的空间去表示它的值(可以想象成真正的人)
    • 可变对象
      • 指 可以在原处修改,而不用创建新的对象(包括列表,字典,集合);
    • 不可变对象
      • 指 不支持在原处修改,只能通过表达式创建新的对象,然后把结果分配给变量(包括 数字,字符串,元组);

概念(python文档)

Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (bindings) 关系。对于自身可变或者包含可变项的集合对象,开发者有时会需要生成其副本用于改变操作,进而避免改变原对象。本模块提供了通用的浅层复制和深层复制操作

在业务中有时我们需要复制一个对象,但是又不想对原对象产生副作用,那就不能通过赋值给新变量来解决了(赋值不是拷贝一个对象)。Python专门提供了一种拷贝机制,基于原对象创建一个含有相同值的对象。拷贝有copy模块提供。

深拷贝

深层次拷贝数据,另开空间,将数据复制到这里。两个数据没有任何联系
* 调用copy.deepcopy()

a = [1,2,3]
b = copy.deepcopy(a)
print(a)
print(id(a))
print(b)
print(id(b))

# [1, 2, 3]
# 1878569025160
# [1, 2, 3]
# 1878569128840

浅拷贝

浅拷贝是指拷贝数据的表层,虽是开辟空间,存储数据,但只是copy表层的数据。若数据是多层嵌套,则第二层的数据只是赋值其引用地址。

自己:在有嵌套和可变类型的情况下,不使用深拷贝的拷贝和赋值都可以认为是浅拷贝
* 切片操作 (切片是一种浅拷贝,仅仅拷贝表层数据)
* 调用copy.copy()
* 工厂函数

注:工厂函数[int()、list()、tuple()]
  • 一个函数,可以生产出属性相同的对象,就像制造水桶都工厂,每一个水桶都具有统一都标准,相同都属性
  • 以字符串为例,当我们创建字符串当时候,通常时写法就是:s = “hello”,这样就创建了一个字符串对象,实际上在背后python上是通过调用str(“hello”)来创建的
# 切片
a = [1,2,3,[4,5]]
b = a[:]
b[3][0] = 7

print(a)
print('*'*50)
print(b)
# [1, 2, 3, [7, 5]]
# **************************************************
# [1, 2, 3, [7, 5]]

for i in a:
    print(i,id(i))

for j in b:
    print(j,id(j))

# 1 140707585643552    1 140707585643552
# **************************************************
# 2 140707585643584    2 140707585643584
# **************************************************
# 3 140707585643616    3 140707585643616
# **************************************************
# [7, 5] 2035734504008    [7, 5] 2392951382600
# **************************************************

# 调用copy.copy()
import copy
a = (1,2,3,[4,5])
b = copy.copy(a)
b[3][0] = 5
print(a) # (1, 2, 3, [5, 5])
print(b) # (1, 2, 3, [5, 5])

# 工厂函数
a = (1,2,3,[4,5])
b = list(a)
b[3][0] = 7
print(a) # (1,2,3,[7,5])
print(b) # [1,2,3,[7,5]]

深拷贝浅拷贝的异同

深浅拷贝异同

posted on 2024-07-14 13:33  酷酷的瑞瑞  阅读(2)  评论(0编辑  收藏  举报