zoukankan      html  css  js  c++  java
  • 深浅cope

    这里应该先介绍变量赋值机制

    浅copy

    现有数据

    data = {
        "name":"alex",
        "age":18,
        "scores":{
            "语文":130,
            "数学":60,
            "英语":98,
        }
    }
    d2 = data
    data["age"] = 20 
    print(d2)
    

    你说d2打印的值里,age是18,还是20?

      {'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}

    看一下id
      

        >>> print('赋值',id(data),id(d2))

        赋值 4439292336 4439292336

      为何是20呢? 因为d2=data相当于只是拿到了data的内存地址,但data里的每个k,v都是有单独的内存的地址的。

      d2,data会一直共享这个dict里的数据,不会出现像之前字符串a=1,b=a, a=2, b依然等于1的情况。

      如果我确实想复制一份完成的dict数据怎么办呢?

        可以用浅copy语法

          data = {
              "name":"alex",
              "age":18,
              "scores":{
                "语文":130,
                "数学":60,
                "英语":98,
              }
          }
        d2 = data.copy()
        data["age"] = 20
        print(d2)
        print(data)
    

      输出

        {'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
        {'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}

    id

        >>> print('浅copy',id(data),id(d2))

        浅copy 4440084720 4440087120

     

        可以看到id是一样的,这样就相当于是2份独立数据了, 但是为什么这个语法叫做浅copy呢? 你改一下score里的值 就知道了。

        data = {
            "name":"alex",
            "age":18,
            "scores":{
                "语文":130,
                "数学":60,
                "英语":98,
            }
        }
        d2 = data.copy()
        data["age"] = 20
        data["scores"]["数学"] = 77  
        print(d2)
        print(data)    

        看输出 , 很神奇,两个Dict里age的值是独立的,但score字典里的分数值貌似是共享的

          {'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 77, '英语': 98}}
          {'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 77, '英语': 98}}

        id

            >>> print(id(data["scores"]),id(d2["scores"]))  #第二层数据

            4440080288 4440080288

      因为浅copy会仅复制dict的第一层数据,更深层的scores下面的值依然是共享一份。

    深copy

      若你想彻底使上面的2个dict完全独立,无论有多少层数据。那就要用python工具包里的一个工具了,

        >>> import copy

        >>> d2 = copy.deepcopy(data)

     

        >>> print('深copy',id(data),id(d2))

          深copy 4439292336 4440080288

     

        >>> data["age"] = 20

        >>> data["scores"]["数学"] = 77

     

        >>> print(d2)

          {'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 60, '英语': 98}}

        >>> print(data)

          {'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 77, '英语': 98}}

     

        >>> print(id(data["age"]),id(d2["age"]))        #第一层数据

          4434787728 4434787664

     

        >>> print(id(data["scores"]),id(d2["scores"]))  #第二层数据

          4440087120 4440896528

  • 相关阅读:
    redis使用watch完成秒杀抢购功能:
    OAUTH协议
    常用mysql命令大全
    版本控制器 (Svn,Git)
    vue axios上传文件实例
    vue-resource 和 axios的区别
    js递归算法1+ 2+3.....100的和
    vue-cli title 里面怎动态显示文字
    Entity Framework With Mysql 之Code First
    关于a标签下的img元素在IE7下不能点击的问题
  • 原文地址:https://www.cnblogs.com/sunny666/p/11516679.html
Copyright © 2011-2022 走看看