zoukankan      html  css  js  c++  java
  • Python3学习笔记(九):赋值,浅拷贝和深拷贝区别

    一、变量赋值


     在Python可变数据类型(列表,字典,集合)中,把一个可变数据类型的变量赋给另一个变量,这两个变量引用的是同一个对象,内存地址是一样的,修改当中的一个变量,另一个变量相应也会被修改

    >>> a = [1,2,3,4,5]           
    >>> b = a           
    >>> id(a)           
    2846410718600  # 变量a的内存地址
    >>> id(b)           
    2846410718600  # 变量b的内存地址
    >>> a[0]=0           
    >>> a           
    [0, 2, 3, 4, 5]
    >>> b           
    [0, 2, 3, 4, 5]

    二、浅拷贝


    拷贝了一个对象的顶层,只拷贝了对象的"引用"

    >>> a = [[1,2,3],4,5]           
    >>> b = a.copy()
    >>> a           
    [[1, 2, 3], 4, 5]    
    >>> b           
    [[1, 2, 3], 4, 5]   
    >>> id(a)               # 变量a的内存地址   
    2846410784136
    >>> id(b)               # 变量b的内存地址
    2846410717512
    >>> id(a[0])            # 变量a中第一个元素的内存地址
    2846410718152
    >>> id(b[0])             
    2846410718152           # 变量b中第一个元素的内存地址

    修改对象中的不可变类型数据,另一个变量不受影响;修改对象中的可变类型子数据,另一个变量相应改变

    >>> a = [[1,2,3],4,5]           
    >>> b = a.copy()           
    >>> a[1] = 6   # 修改的为不可变数据类型        
    >>> a           
    [[1, 2, 3], 6, 5]
    >>> b           
    [[1, 2, 3], 4, 5]
    >>> a[0][1]=0  # 修改的为可变(列表中的数据)数据类型           
    >>> a           
    [[1, 0, 3], 6, 5]
    >>> b           
    [[1, 0, 3], 4, 5]

    三、深拷贝


     对对象中的每一层都进行了拷贝,拷贝后的对象与原对象为完全独立,没有任何关系。

    >>> from copy import deepcopy           
    >>> a = [[1,2,3],4,5]
    >>> b = deepcopy(a)           
    >>> a           
    [[1, 2, 3], 4, 5]
    >>> b           
    [[1, 2, 3], 4, 5]
    >>> id(a)           
    2846410715976
    >>> id(b)           
    2846410515720
    >>> id(a[0])           
    2846410717896
    >>> id(b[0])           
    2846410718856

    即使修改当中一个变量的可变类型子数据,另一个变量也不会受影响

    >>> from copy import deepcopy
    >>> a = [[1,2,3],4,5]           
    >>> b = deepcopy(a)           
    >>> a           
    [[1, 2, 3], 4, 5]
    >>> b           
    [[1, 2, 3], 4, 5]
    >>> a[0][1]=0           
    >>> a           
    [[1, 0, 3], 4, 5]
    >>> b           
    [[1, 2, 3], 4, 5]
  • 相关阅读:
    获取一个表的,字段,类型,长度,是否主键,是否为空,注释 等信息
    单个页面Request编码方式的改变,无需改动Web.config~
    关于锚点页内链接跳转出现问题(不响应,没有反应)的解决方法(ZT)
    40种网站设计常用技巧~
    在MasterPage中检验session是否存在~
    如何避免重构带来的危险
    早该知道的7个JavaScript技巧
    30个提高Web程序执行效率的好经验
    我学编程时犯的最大两个错误
    C# 中get和set属性的作用
  • 原文地址:https://www.cnblogs.com/eastonliu/p/9096800.html
Copyright © 2011-2022 走看看