zoukankan      html  css  js  c++  java
  • pyhton中的深浅copy

    深浅拷贝:数据分离情况

    1. =赋值:数据完全共享(指向内存中的同一个对象)
    被赋值的变量指向的数据和原变量的数据都是指向内存中的同一个地址:

    • (1)如果是不可变数据类型(数字、字符串等),修改其中的一个值,实际是修改了变量指向与值对应的地址(相当于重新被赋值),因此不会同时发生变化;
    • (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
    •  1 print("以下是赋值")
       2 a=[1,2,"4",[4,5]]
       3 b=a
       4 print(a,id(a))
       5 print(b,id(b))
       6 
       7 b[0]=11
       8 b[3][0]=44
       9 print(a)
      10 print(b)
      11 
      12 
      13 #结果:
      14 #以下是赋值
      15 # [1, 2, '4', [4, 5]] 119820576
      16 # [1, 2, '4', [4, 5]] 119820576
      17 # [11, 2, '4', [44, 5]]
      18 # [11, 2, '4', [44, 5]]

     2. 浅copy:数据半共享(仅可变数据类型指向同一个对象)
    复制其数据独立内存存放(新建一个地址指向),但是只拷贝成功第一层:

    • (1)如果是不可变数据类型(数字、字符串等),共用其地址,但修改其中一个变量的值,由于浅copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
    • (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
    •  1 print("以下是浅拷贝")
       2 
       3 a=[1,2,"4",[4,5]]
       4 b=a.copy()
       5 print(a,id(a),id(a[0]),id(a[-1]))
       6 print(b,id(b),id(b[0]),id(b[-1]))
       7 
       8 b[0]=11
       9 b[3][0]=44
      10 print(a)
      11 print(b)
      12 
      13 # 结果:
      14 # 以下是浅拷贝
      15 [1, 2, '4', [4, 5]] 127947040 1350511760 128225072
      16 [1, 2, '4', [4, 5]] 56886776 1350511760 128225072
      17 [1, 2, '4', [44, 5]]
      18 [11, 2, '4', [44, 5]]

      

    3. 深copy:数据完全不共享(数据独立,互不影响)
    复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享:

    • (1)如果是不可变数据类型(数字、字符串等),修改其中一个变量的值,由于深copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
    • (2)如果是可变数据类型(列表、字典等),深拷贝完全复制独立的一份,在修改数据时仅仅是其本身的地址指向发生了改变,由于是深copy,指向可变数据类型的地址完全独立,因此另一个变量不会发生改变。
    •  1 import copy
       2 print("以下是深拷贝")
       3 
       4 a=[1,2,"4",[4,5]]
       5 b=copy.deepcopy(a)
       6 print(a,id(a),id(a[0]),id(a[-1]))
       7 print(b,id(b),id(b[0]),id(b[-1]))
       8 
       9 b[0]=11
      10 b[3][0]=44
      11 print(a)
      12 print(b)
      13 
      14 结果:
      15 以下是深拷贝
      16 [1, 2, '4', [4, 5]] 123425056 1350511760 123703088
      17 [1, 2, '4', [4, 5]] 52233720 1350511760 123700448
      18 [1, 2, '4', [4, 5]]
      19 [11, 2, '4', [44, 5]]
  • 相关阅读:
    DMALL刘江峰:生鲜市场具有巨大O2O改造空间
    互联网产品经理能力体系
    Review Board——在线代码审查工具
    Java Dns Cache Manipulator
    Keepalived 双机web服务宕机检测切换系统软件
    weblogic性能调优参考
    spring的ResultSetWrappingSqlRowSet使用rs.getTimestamp取oracle数据库时分秒问题
    oracle ORA-01747(系统保留关键字)user.table.column, table.column 或列说明无效 hibernate映射oracle保留关键字
    javascript模块化编程(AMD规范的加载器)
    oracle定时运行 存储过程
  • 原文地址:https://www.cnblogs.com/open-yang/p/10852211.html
Copyright © 2011-2022 走看看