编辑
2025-02-16
Python
00
请注意,本文编写于 125 天前,最后修改于 125 天前,其中某些信息可能已经过时。

目录

1. 赋值(Assignment)
5.示例验证

在Python中,赋值、浅拷贝和深拷贝的主要区别在于对对象的复制深度和内存引用方式。以下是详细对比:

1. 赋值(Assignment)

  • 核心机制:直接让新变量指向原对象的内存地址(即引用传递)。

  • 特点:

    • 新旧变量共享同一个对象。

    • 修改其中一个变量会影响另一个(无论对象是否可变)。

  • 示例:

    python
    a = [1, [2, 3]] b = a # 赋值操作 a.append(4) # 修改原对象 print(b) # 输出:[1, [2, 3], 4](b同步变化)

2. 浅拷贝(Shallow Copy)

  • 核心机制:创建新对象,但仅复制原对象的顶层元素,嵌套对象仍通过引用共享。

  • 实现方式:

    • copy.copy() 函数

    • 列表的切片操作 list[:]

    • 字典的 dict.copy() 方法

  • 特点:

    • 仅复制顶层对象,嵌套的可变对象(如列表中的列表)会被共享。

    • 修改原对象的顶层元素不影响拷贝对象,但修改嵌套对象会影响拷贝对象。

  • 示例:

    python
    import copy a = [1, [2, 3]] b = copy.copy(a) # 浅拷贝 a.append(4) # 修改顶层元素 a[1].append(5) # 修改嵌套元素 print(a) # 输出:[1, [2, 3, 5], 4] print(b) # 输出:[1, [2, 3, 5]](嵌套元素同步变化,顶层不变化)

3. 深拷贝(Deep Copy)

  • 核心机制:递归创建新对象,完全复制原对象及其所有嵌套对象。

  • 实现方式:copy.deepcopy() 函数。

  • 特点:

    • 新旧对象完全独立,无论层级多深,修改彼此互不影响。

  • 示例:

    python
    import copy a = [1, [2, 3]] b = copy.deepcopy(a) # 深拷贝 a.append(4) # 修改顶层元素 a[1].append(5) # 修改嵌套元素 print(a) # 输出:[1, [2, 3, 5], 4] print(b) # 输出:[1, [2, 3]](完全独立,无变化)

4.关键事项注意

  • 可变对象与不可变对象:

    • 对不可变对象(如字符串、元组)的浅拷贝和赋值行为可能表现相同。

    • 对可变对象(如列表、字典),浅拷贝和深拷贝的差异显著。

  • 性能权衡:

    • 浅拷贝速度更快,内存占用少。

    • 深拷贝因递归复制所有层级,性能开销较大,适合复杂嵌套结构。

  • 自定义对象:

    • 可通过实现 copy() 和 deepcopy() 方法控制拷贝行为。

5.示例验证

python
import copy # 原对象 original = [1, [2, 3]] # 赋值 assigned = original # 浅拷贝 shallow = copy.copy(original) # 深拷贝 deep = copy.deepcopy(original) # 修改原对象的顶层和嵌套元素 original.append(4) original[1].append(5) print("原对象:", original) # [1, [2, 3, 5], 4] print("赋值结果:", assigned) # [1, [2, 3, 5], 4] print("浅拷贝结果:", shallow) # [1, [2, 3, 5]] print("深拷贝结果:", deep) # [1, [2, 3]] 结果验证: 赋值对象完全同步变化。 浅拷贝的嵌套列表同步变化,但顶层元素独立。 深拷贝完全不受影响。
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:赵耀伟

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!