zoukankan      html  css  js  c++  java
  • 我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)

    三、深浅拷贝

      在Python中将一个变量的值传递给另外一个变量通常有三种:赋值、浅拷贝以及深拷贝

      讨论深浅拷贝之前我们把Python的数据类型分为基本数据类型包括数字、字符串、布尔以及None等,还有一种像列表、元祖、字典等属于有基本数据类型作为最基本的元素组成的

         在Python中基本数据类型的赋值、浅拷贝及深拷贝没有任何意义,都是指向同一块内存地址,也不存在层次的问题

    >>> import copy
    >>> n1 = 'abc'
    >>> n2 = n1
    >>> n3 = copy.copy(n1)
    >>> n4 = copy.deepcopy(n1)
    >>> id(n1)
    140350336680040
    >>> id(n2)
    140350336680040
    >>> id(n3)
    140350336680040
    >>> id(n4)
    140350336680040

      说明:Python的copy模块的copy和deepcopy函数分别为我们实现了浅拷贝和深拷贝,我们可以看到,赋值、浅拷贝和深拷贝他们最后的id(Python内存地址的表达方式)都是一样的,没有分别

      现在讨论其他的字典,列表等这些非基本数据类型对象的赋值、浅拷贝及深拷贝的区别

      假设我们有这么一个字典n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]} 

      1、赋值

      我们知道赋值及时将变量的内存赋个另一个变量,让另一个变量指向那个内存地址

     

    >>> n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]}               
    >>> id(n1)
    140350328984328
    >>> n2 = n1
    >>> id(n2) 
    140350328984328 # 可以看到内存地址和n1是完全一样的

      2、浅拷贝

      浅拷就是在内存中将第一层额外开辟空间进行存放

    >>> n3 = copy.copy(n1)
    >>> id(n3)
    140350328986504 # 可以看n3的内存地址已经和n1不同了

       但是如果我们继续深入看一下n3里面的第二层的非基本数据类型的元素

    >>> id(n1['k3'])
    140350328603976
    >>> id(n3['k3']) 
    140350328603976 # 字典里的列表还是指向同一个列表

      3、深拷贝

      深拷贝就是在内存中将数据从新创建一份,不仅仅是第一层,第二层、第三层...都会重新创建一份

     

    >>> id(n1['k3'])
    140350328603976
    >>> id(n4['k3'])
    140350328604296 # 可以看到第二层的列表也拷贝了一份,内存地址已经完全不一样

      注意:这仅局限于非基本数据类型,基本数据类型还会是同一个内存地址

    >>> id(n1['k1'])
    140350336680040
    >>> id(n4['k1'])
    140350336680040
  • 相关阅读:
    课程作业03-1
    课程作业02
    课程作业01:模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
    《大道至简》第一章读后感,伪代码
    《美国教授写给被开除中国留学生的信》阅读笔记
    《大道至简》读后感
    《需求工程——软件建模与分析》阅读笔记02
    《需求工程——软件建模与分析》阅读笔记01
    微信小游戏开发笔记03
    微信小游戏开发笔记02
  • 原文地址:https://www.cnblogs.com/zhangxiaxuan/p/5137854.html
Copyright © 2011-2022 走看看