python浅拷贝与深拷贝

    xiaoxiao2022-07-13  169

           最近看了一些Python的教学视频,其中看到一个关于Python拷贝(浅拷贝与深拷贝)的知识点,老师说这是重点,所以在这里分享一下我对浅拷贝与深拷贝的理解。

           Python的拷贝方式分为两种,一种是浅拷贝,另一种是深拷贝,所谓浅拷贝,通俗点说就是把一个变量的值赋给另一个变量,Python对变量赋值的处理方式和C、C++不同,对于某个赋值语句如a=100,C、C++是开辟一块空间,这个空间的名字是a,然后把100放入a所在的空间,如果变量的值改变,那么a的地址不变,变化的只是a所在地址里的值,而Python是开辟一块空间,名字是整数100,然后变量a指向100,如果a的值改变,比如改成a=200,那么100的地址不变,另外开辟一块名字为200的空间,让a指向他,本人语文不好,说的可能有点迷,大家看下面的代码会直观一点:

    python:

    a = 100 print(id(a)) a = 200 print(id(a))

    执行结果为:

    1574664352

    1574667552

    C++:

    int a; a = 100; cout<<&a<<endl; a = 200; cout<<&a<<endl;

    执行结果为:

    0x6dfefc 0x6dfefc

    因为Python有这样的特点,造成Python的拷贝方式被分为浅拷贝和深拷贝。

    浅拷贝,简单点就是变量之间相互赋值,如下:

    a = [11,22,33] b = a print(id(a)) print(id(b))

    执行结果为:

    1574664352

    1574664352

    可以看到,两个变量共用一块内存地址,图示如下:

    浅拷贝还可以通过copy库中的copy函数来进行,代码如下:

    import copy a = 100 c = copy.copy(a) print(id(a)) print(id(c))

     执行结果为:

    1574664352

    1574664352

    所谓深拷贝,就是另外开辟一块空间,将被拷贝变量的值放进去,然后让新变量指向新开辟的内存空间,深拷贝用copy库中的deepcopy函数实现,代码如下:

    import copy a = [11,22,33] b = copy.deepcopy(a) print(id(a)) print(b) print(id(b))

    执行结果为:

    2400936241032

    [11, 22, 33]

    2400936240968

    可以发现地址已经被改变。

    图示如下:

    这里要说一个注意的问题,深拷贝的作用对象只能是Python当中的可变数据类型,如列表和字典,对于不可变数据类型如元组tuple和数值型来说是没有用的,我举个例子大家就明白了:

    import copy a = 100 b = (11,22,33) c = copy.deepcopy(a) d = copy.deepcopy(b) print(id(a)) print(id(c)) print(id(b)) print(id(d))

    执行结果为:

    1574664352

    1574664352

    2400936875928

    2400936875928

    可以发现地址并没有被改变。

    以上只是对深拷贝和浅拷贝的一个很浅的理解,大佬勿喷。

    如果有写的不对的地方还请各位大佬批评指正。

    最新回复(0)