博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深浅cope
阅读量:5294 次
发布时间:2019-06-14

本文共 2281 字,大约阅读时间需要 7 分钟。

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

 

浅copy

现有数据

data = {    "name":"alex",    "age":18,    "scores":{        "语文":130,        "数学":60,        "英语":98,    }}d2 = datadata["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

 

转载于:https://www.cnblogs.com/sunny666/p/11516679.html

你可能感兴趣的文章
bash使用规则
查看>>
AVL数
查看>>
第二章练习
查看>>
ajax2.0
查看>>
C#时间截
查看>>
C语言程序设计II—第九周教学
查看>>
C# 获取系统时间及时间格式转换
查看>>
WCF、WebAPI、WCFREST、WebService之间的区别
查看>>
2018-2019-2-20175332-实验四《Android程序设计》实验报告
查看>>
全栈12期的崛起之捡点儿有用的说说
查看>>
基础类型
查看>>
属性动画
查看>>
标识符
查看>>
Swift 常量&变量
查看>>
Sqli labs系列-less-4 这关好坑!!!
查看>>
路由跟踪工具0trace
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
T-SQL触发器,限制一次只能删除一条数据
查看>>
boost库使用:vs2013下boost::container::vector编译出错解决
查看>>