python深浅拷贝

可变类型和不可变类型

不可变对象:一旦创建就不可修改的对象,包括字符串、元组、数值类型(整型、浮点型)
该对象所指向的内存中的值不能被改变。当改变某个变量的时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这回开辟一个新的地址,变量再指向这个新的地址
可变对象:可以修改的对象,包括列表、字典、集合
该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的地址,通俗点就是原地址改变

变量赋值执行原理

a = "python"

Python解释器干的事情:

  1. 创建变量a
  2. 创建一个对象(分配一块内存),来存储值"python"
  3. 将变量与对象,通过指针连接起来,从变量到对象的连接称之为引用(变量引用对象)

深浅拷贝总结

1.所谓的深浅拷贝分别指的是:
浅拷贝:copy模块的copy()
深拷贝:copy模块的deepcopy()
2.大白话解释深浅拷贝:
深拷贝拷贝的深,浅拷贝拷贝的浅
3.深浅拷贝主要是针对可变类型来讲,深拷贝拷贝所有层(可变),浅拷贝只拷贝第一层(拷贝)
如果针对不可变类型,则用法和普通赋值一样,并无区别

代码

"""
案例:深浅拷贝
记忆(总结):
    1.所谓的深浅拷贝分别指的是:
        浅拷贝:copy模块的copy()
        深拷贝:copy模块的deepcopy()
    2.大白话解释深浅拷贝:
        深拷贝拷贝的深,浅拷贝拷贝的浅
    3.深浅拷贝主要是针对可变类型来讲,深拷贝拷贝所有层(可变),浅拷贝只拷贝第一层(拷贝)
        如果针对不可变类型,则用法和普通赋值一样,并无区别
"""
import copy


def demo1_普通赋值():
    a = 10
    b = a
    print('id( a)->', id(a))
    print('id( b)->', id(b))
    print('id(10)->', id(10))
    a = [1, 2, 3]
    b = [11, 22, 33]
    c = [a, b]
    d = c
    print('id( c)->', id(c))
    print('id( d)->', id(d))


def demo2_浅拷贝可变类型():
    a = [1, 2, 3]
    b = [11, 22, 33]
    c = [6, 7, a, b]
    d = copy.copy(c)
    print('id( c)->', id(c))
    print('id( d)->', id(d))

    print(id(c[2]))
    print(id(a))
    a[2] = 22
    print('c->', c)
    print('d->', d)


def demo3_浅拷贝不可变类型():
    a = (1, 2, 3)
    b = (11, 22, 33)
    c = (6, 7, a, b)
    d = copy.copy(c)
    print('id( c)->', id(c))
    print('id( d)->', id(d))


def demo4_深拷贝可变类型():
    a = [1, 2, 3]
    b = [11, 22, 33]
    c = [6, 7, a, b]
    d = copy.deepcopy(c)
    print('id( c)->', id(c))
    print('id( d)->', id(d))

    print(id(c[2]))
    print(id(a))
    a[2] = 22
    print('c->', c)
    print('d->', d)


def demo5_深拷贝不可变类型():
    a = (1, 2, 3)
    b = (11, 22, 33)
    c = (6, 7, a, b)
    d = copy.deepcopy(c)
    print('id( c)->', id(c))
    print('id( d)->', id(d))


def demo6():
    a = [1, 2, 3]
    b = (11, 22, 33)
    c = (6, 7, a, b)
    d = copy.deepcopy(c)
    c[2][0] = 2
    print('id( c)->', id(c))
    print('id( d)->', id(d))
    print(c)
    print(d)
    print(id(c[2]))
    print(id(d[2]))
    print(id(c[3]))
    print(id(d[3]))


if __name__ == "__main__":
    # demo1_普通赋值()
    # demo2_浅拷贝可变类型()
    # demo3_浅拷贝不可变类型()
    # demo4_深拷贝可变类型()
    # demo5_深拷贝不可变类型()
    demo6()


图解

image
image
image
image

posted @ 2026-04-24 11:07  孟婆~来杯三鹿  阅读(4)  评论(0)    收藏  举报