美文网首页
2018-10-22 Python30 深拷贝&浅拷贝

2018-10-22 Python30 深拷贝&浅拷贝

作者: 孟圆的笔记 | 来源:发表于2018-10-22 09:19 被阅读0次
  • 浅拷贝,拷贝完后,地址一样:
In [75]: a = [11,22,33]

In [76]: b = a

In [77]: id(a)
Out[77]: 139742502804296

In [78]: id(b)
Out[78]: 139742502804296

Python中都是浅拷贝,内容共享。你修改你的,我的也跟着变了。
 


 

  • 深拷贝,可以通过copy模块进行:
In [82]: import copy

In [83]: a = [11,22,33]

In [84]: b = copy.deepcopy(a)

In [86]: id(a)
Out[86]: 139742502803976

In [87]: id(b)
Out[87]: 139742502835464

复制一份给你,但内容不共享。你以后修改了,与我的那份无关。


copy.deepcopy()copy.copy() 都只会对可变类型进行深拷贝。

不同的是:
deepcopy() 是会递归判断的深拷贝:如果下一层是可变类型,那么下一层以及下一层之前的层都进行深拷贝。

In [93]: a = [11,22,33]
In [94]: b = [44,55,66]
In [95]: c = [a,b]              #list  
In [96]: d = copy.deepcopy(c)
In [97]: a.append(44)
In [98]: c
Out[98]: [[11, 22, 33, 44], [44, 55, 66]]
In [99]: d
Out[99]: [[11, 22, 33], [44, 55, 66]]


In [140]: a = [11,22,33]
In [141]: b = [44,55,66]
In [142]: c = (a,b)            #元祖   递归判断
In [143]: d = copy.deepcopy(c)
In [144]: c is d
Out[144]: False
In [145]: a.append(44)
In [146]: c
Out[146]: [[11, 22, 33, 44], [44, 55, 66]]
In [147]: d
Out[147]: [[11, 22, 33], [44, 55, 66]]


In [134]: a = (11,22,33)
In [135]: b = (44,55,66)
In [136]: c = (a,b)            #不可变
In [137]: d = copy.deepcopy(c)
In [138]: c is d
Out[138]: True                 


In [131]: c = (11,22)          #不可变
In [132]: d = copy.deepcopy(c)
In [133]: c is d
Out[133]: True                

copy.copy()非递归深拷贝,只考虑第一层:如果第一层是可变类型,则只对第一层深拷贝;如果第一层不是可变类型,则进行浅拷贝。

In [106]: a = [11,22,33]
In [107]: b = [44,55,66]
In [108]: c = [a,b]     #list  不进行递归判断
In [109]: d = copy.copy(c)
In [110]: id(c)
Out[110]: 139742502712840
In [111]: id(d)
Out[111]: 139742502645512
In [112]: a.append(44)
In [113]: c
Out[113]: [[11, 22, 33, 44], [44, 55, 66]]
In [114]: d
Out[114]: [[11, 22, 33, 44], [44, 55, 66]]


In [146]: a = [11,22,33]
In [147]: b = [44,55,66]
In [148]: c = (a,b)    #元祖  不进行递归判断
In [149]: d = copy.copy(c)
In [150]: c is d
Out[150]: True

 


其它语言专场:
 

其它语言,例如: c、Java :
        只会对不可变类型进行深拷贝可变类型都是浅拷贝
        函数传参的时候可以看出来。

package xxx;

import java.util.List;
import java.util.ArrayList;

class A{
    String name = "abc";
    @Override
    public String toString() {
        return "A [name=" + name + "]";
    }
}

public class DeepCopy_ShallowCopy {
    
    static void changeA(A a){
        a.name += "222";
        System.out.println(a);
    }
    static void changeD(List d){
        d.add("222");
        System.out.println(d);
    }
    static void changeB(String b){
        b += "222";
        System.out.println(b);
    }
    static void changeC(int c){
        c+=222;
        System.out.println(c);
    }

    public static void main(String[] args) {
        A a = new A();
        List d = new ArrayList();
        d.add("aa");
        d.add("bb");
        d.add("cc");
        String b = "bbb";
        int c = 333;
        
        System.out.println("函数里:");
        changeA(a);
        changeD(d);
        changeB(b);
        changeC(c);
        
        System.out.println("-------------------");
        
        System.out.println("函数外:");
        System.out.println(a);
        System.out.println(d);
        System.out.println(b);
        System.out.println(c);
    }

}

函数外,值变了的是浅拷贝,内容共享。
函数外,值没变的是深拷贝,函数里操纵的是另一片内存。

函数里:
A [name=abc222]      
[aa, bb, cc, 222]
bbb222
555
-------------------
函数外:
A [name=abc222]      #变了
[aa, bb, cc, 222]    #变了
bbb            #没变
333            #没变

相关文章

  • 2018-10-22 Python30 深拷贝&浅拷贝

    浅拷贝,拷贝完后,地址一样: Python中都是浅拷贝,内容共享。你修改你的,我的也跟着变了。 深拷贝,可以通过c...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • 深拷贝和浅拷贝

    1.深拷贝:地址的拷贝 2.浅拷贝:是值得拷贝 深拷贝和浅拷贝的区别 A拷贝B B变A变是浅拷贝 A拷贝B B变A...

网友评论

      本文标题:2018-10-22 Python30 深拷贝&浅拷贝

      本文链接:https://www.haomeiwen.com/subject/ilewzftx.html