zoukankan      html  css  js  c++  java
  • python 浅拷贝和深拷贝(9)

        何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~

     
    python
     

    一.普通的变量赋值

        我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下:

    list1 = [1,2,3,4,5]
    # 普遍的变量赋值
    list2 = list1
    print(id(list1))
    print(id(list2))
     
    # 修改列表list2的数据
    list2.append(123)
    print(list1)
    print(list2)

     

    输出结果:

    2251297055368
    2251297055368
    [1, 2, 3, 4, 5, 123]
    [1, 2, 3, 4, 5, 123]

        注意:常规的变量赋值共享一个内存块,内存地址相同,一旦值发生改变,共享同一个内存地址的所有变量值都会发生改变,可以直接通过内置函数id()对比下内存地址即可!

     

    哟呵

     

    二.浅拷贝和深拷贝

        在python开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下copy模块:

        copy.copy() – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;

        copy.deepcopy() – 深拷贝,重新分配内存,拷贝对象及其所有子对象;

    浅拷贝/深拷贝

        1.浅拷贝copy()

    # !usr/bin/env python
    # -*- coding:utf-8 _*-
    """
    @Author:何以解忧
    @Blog(个人博客地址): shuopython.com
    @WeChat Official Account(微信公众号):猿说python
    @Github:www.github.com
     
    @File:python_copy.py
    @Time:2019/10/27:25
     
    @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    """
     
    import copy
    spam = ['A', 'B', 'C', 'D']
    # 使用浅拷贝
    cheese = copy.copy(spam)
    cheese[1] = 42
    print(id(spam),spam)
    print(id(cheese),cheese)

    输出结果:

    57205555 ['A', 'B', 'C', 'D']
    57208888 ['A', 42, 'C', 'D']

     

        2.深拷贝deepcopy()

    import copy
    spam = ['A', 'B', 'C', 'D']
    # 使用深拷贝
    cheese = copy.deepcopy(spam)
    cheese[1] = 42
    print(id(spam),spam)
    print(id(cheese),cheese)

     

    输出结果:

    57205555 ['A', 'B', 'C', 'D']
    57208888 ['A', 42, 'C', 'D']

     

        3.浅拷贝和深拷贝区别

        对于常规的字典或者列表使用copy模块的深拷贝或者浅拷贝,两者并没有区别!如果字典或者列表中还有包含有子类的话,使用copy模块的深拷贝和浅拷贝的话,结果就大不相同了:

        copy.copy() — 重新分配内存,只拷贝父对象,不会拷贝对象内部的子对象;

        copy.deepcopy() — 重新分配内存,拷贝对象及其所有子对象;

        示例代码如下:

    import copy
     
    print("使用浅拷贝:")
    spam = [['A','E'], 'B', 'C', 'D']
    # 使用浅拷贝
    cheese = copy.copy(spam)
    cheese[0][0] = 42
    print(id(spam),spam)
    print(id(cheese),cheese)
    print("***"*20)
     
    print("使用深拷贝:")
    spam = [['A','E'], 'B', 'C', 'D']
    # 使用深拷贝
    cheese = copy.deepcopy(spam)
    cheese[0][0] = 42
    print(id(spam),spam)
    print(id(cheese),cheese)

    输出结果:

    使用浅拷贝:
    2179653046408 [[42, 'E'], 'B', 'C', 'D']
    2179653046920 [[42, 'E'], 'B', 'C', 'D']
    ************************************************************
    使用深拷贝:
    2179653086728 [['A', 'E'], 'B', 'C', 'D']
    2179653046408 [[42, 'E'], 'B', 'C', 'D']

        由此可见:

        如果列表或者字典没有包含子列表或者子字典的话,使用深拷贝或者浅拷贝效果都有一样;

        如果列表或者字典中存在子类的时候,只有深拷贝才会为所有的子类也重新分配内存,而浅拷贝只负责父对象,不考虑子对象!!

    耳朵

     

    猜你喜欢:

        1.python列表推导式

        2.python字典推导式

        3.python return逻辑运算

        4.python线程创建

        5.python匿名函数lambda

     

        转载请注明:猿说Python » python浅拷贝和深拷贝

     

    技术交流、商务合作请直接联系博主
    扫码或搜索:猿说python
    python教程公众号
    猿说python
    微信公众号 扫一扫关注
  • 相关阅读:
    常见的五种App开发模式
    iOS提供的实用的属性和方法
    iOS开发思想
    iOS函数式编程
    iOS链式编程范例
    ios不起眼的错误
    iOS将汉字转成拼音
    ReactiveCocoa
    LuaViewSDK
    pycharm配置qtdesigner
  • 原文地址:https://www.cnblogs.com/shuopython/p/12048582.html
Copyright © 2011-2022 走看看