Python 的深拷贝 和 浅拷贝

本文详细介绍了Python中实现归并排序的方法,包括递归分解、合并过程等关键步骤,并探讨了如何正确复制列表以避免数据污染的问题。

今天实现Python的排序问题,比如如下的代码:

    def merge(self, l, r):
        if l == r - 1 or l == r:
            return

        mid = (l + r) // 2
        self.merge(l, mid)
        self.merge(mid, r)

        length = r - l
        left = [i for i in self.data[l:mid]]
        right = [i for i in self.data[mid:r]]

        i = j = 0
        k = l
        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                self.data[k] = left[i]
                i += 1
            else:
                self.data[k] = right[j]
                j += 1
            k += 1
        if i == len(left):
            while k - l < length:
                self.data[k] = right[j]
                k += 1
                j += 1
        else:
            while k - l < length:
                self.data[k] = left[i]
                i += 1
                k += 1

    def MergeSort(self):
        len = self.n
        self.merge(0, len)
        return self.data

以上是正确的写法,但是一开始的写法是直接使用了:

left = self.data[l:mid]
right = self.data[mid+1:r]

这样子实际上leftright 就是一个实际的应用,也就是说修改这个的时候会同时原来的self.data 的数据,为了避免这个问题,我们的拷贝必须使用 一些特殊的技巧:

newList = list(arr[l:r])
newList = [i for i in arr[l:r]]

import copy as cp # emmmm,这个缩写,233333
newList = cp.copy(arr[l:r])

一般不用引入一个包来解决问题,前两个已经很不错了

### Python深拷贝浅拷贝的区别及用法 #### 一、概念区分 在Python中,`copy`模块提供了两种主要的复制方式——浅拷贝(shallow copy)深拷贝(deep copy)。 - **浅拷贝**仅创建一个新的对象,并将原对象中的引用复制到新对象中。这意味着对于嵌套结构,内部对象仍然是共享的[^3]。 - **深拷贝**不仅会创建一个新的对象,还会递归地复制其所有的子对象,从而确保原始对象及其所有嵌套部分都不会被修改影响[^4]。 --- #### 二、实现方法 1. **浅拷贝** - 使用 `copy.copy()` 方法可以完成浅拷贝操作。 - 对于简单数据类型(如整数、浮点数),由于它们是不可变的,因此即使使用浅拷贝也不会出现问题[^1]。 - 如果涉及复杂的数据结构(如列表或字典),则需要注意其中的内容是否会受到影响。 2. **深拷贝** - 使用 `copy.deepcopy()` 方法来执行深拷贝操作。 - 这种方式适用于任何类型的对象,尤其是那些包含嵌套结构的情况,能够彻底隔离源对象与其副本之间的联系[^2]。 --- #### 三、代码示例 以下是关于如何运用这两种技术的具体实例: ```python import copy # 基本数值测试 a = 5 shallow_a = copy.copy(a) deep_a = copy.deepcopy(a) print("基本数值:") print(f"原始值: {a}, 浅拷贝后: {shallow_a}, 深拷贝后: {deep_a}") # 列表测试 list1 = [1, 2, 3] shallow_list1 = copy.copy(list1) deep_list1 = copy.deepcopy(list1) list1.append(4) # 修改原列表 print("\n列表追加元素:") print(f"原始列表: {list1}") print(f"浅拷贝列表: {shallow_list1}") print(f"深拷贝列表: {deep_list1}") # 复杂嵌套列表测试 nested_list = [1, 2, [3, 4]] shallow_nested = copy.copy(nested_list) deep_nested = copy.deepcopy(nested_list) nested_list[2].append(5) # 修改嵌套列表内的内容 print("\n嵌套列表修改内部元素:") print(f"原始嵌套列表: {nested_list}") print(f"浅拷贝嵌套列表: {shallow_nested}") print(f"深拷贝嵌套列表: {deep_nested}") ``` 运行以上程序的结果表明,在处理简单的线性数组时两者表现一致;然而一旦涉及到多层次或者复杂的组合型资料,则只有采用深层复制才能够有效防止意外更改传播至其他地方[^1]^. --- #### 四、总结对比表格 | 特性 | 浅拷贝 | 深拷贝 | |-----------------|-------------------------------------|----------------------------------| | 定义 | 创建一层级的新容器 | 构建整个树状结构 | | 子对象关系 | 继续指向原来的内存位置 | 新分配独立空间 | | 执行效率 | 较高 | 更低 | | 应用场景 | 非嵌套或无需保护内部状态变化 | 数据安全需求严格 | --- #### 五、注意事项 尽管深拷贝能提供更高的安全性,但在实际开发过程中应权衡性能开销。如果确认目标数据不会发生变化或是单一层次的关系链路较短的话,选用浅层方案往往更为合适[^4]. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值