zoukankan      html  css  js  c++  java
  • python_深浅拷贝

    1、赋值:

    1 list_1=[['a','b'],1,2]
    2 list_2=list_1
    3 
    4 print(list_1)
    5 print(list_2)
    
    >>>[['a', 'b'], 1, 2]
    >>>[['a', 'b'], 1, 2]

    在python3中赋值操作其实就是对象的应用,如上边的例子list_1与list_2这俩变量指向的都是同一块内存地址,也就是说list_2并没有重新开辟一块属于自己内存空间。

    (通过id( )函数可以查看对象的内存地址)

    1 print(id(list_1))
    2 print(id(list_2))

    >>>1656445373192
    >>>1656445373192

    共同指向同一个内存地址(1656445373192),如果把这块内存空间看成一个房间的话,那就是给这个房间找了两个主人,房间里的所有东西属于两人的公共财产,同进退,共生死!

     1 list_1=[['a','b'],1,2]
     2 list_2=list_1
     3 
     4 list_2[0][0]="aaa"
     5 list_1[2]=222
     6 
     7 print(list_1)
     8 print(list_2)
     >>>[['aaa', 'b'], 1, 222]
    >>>[['aaa', 'b'], 1, 222]
    10 del list_1 #deL函数只能删除变量名,对内存地址不做操作 11 print(list_2)
    >>>[['aaa', 'b'], 1, 222]

    11 list_2.clear() #clear()函数不删除变量名,但会清除对应的内存空间
    12 print(list_1)
    >>>[]

    2、浅拷贝

    1 list_1=[['a','b'],1,2]
    2 
    3 #浅拷贝的三种形式,结果是一样的
    4 list_2=list_1.copy()
    5 list_2=list_1[:]
    6 
    7 import  copy
    8 list_2=copy.copy(list_1)

    浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层

    1 list_1=[['a','b'],1,2]
    2 list_2=list_1.copy()
    3 
    4 list_2[0][0]="aaa"
    5 list_2[2]=222
    6 print(list_1)
    7 print(list_2)
    >>>[['aaa', 'b'], 1, 2]
    >>>[['aaa', 'b'], 1, 222]

    如图所说:list_2=list_1.copy() 其实等于 list_2=[[000123],1,2]。也就是说只有小列表中的元素是两人的公共财产(好比俩人的孩子),1和2 赋予各自的私有财产。

    3、深拷贝

     1 list_1=[['a','b'],1,2]
     2 
     3 import copy
     4 list_2=copy.deepcopy(list_1)
     5 
     6 list_2[0][0]="aaa"
     7 list_2[2]=222
     8 
     9 print(list_1)
    10 print(list_2)
    >>>[['a', 'b'], 1, 2]
    >>>[['aaa', 'b'], 1, 222]

    深拷贝就比较直接了,就是很单纯的很粗暴的克隆一份数据出来自己玩,自己想咋作就咋作,跟别人无关。

    4、拷贝的警告  

      1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。

      2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。

  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/Adairye/p/8570929.html
Copyright © 2011-2022 走看看