zoukankan      html  css  js  c++  java
  • python的浅拷贝和深拷贝的区别

    # -*- coding:utf-8 -*-
    import copy
    
    a = ['test', [[1,2],3]]
    
    b = a
    c = copy.copy(a)
    d = copy.deepcopy(a)
    
    print id(b), id(a), id(c), id(d)
    
    print [id(x) for x in a]
    print [id(x) for x in b]
    print [id(x) for x in c]
    print [id(x) for x in d]
    
    print [id(x) for x in a[1]]
    print [id(x) for x in c[1]]
    print [id(x) for x in d[1]]
    

      输出

    28776488 28776488 28791512 28791552
    [28583936, 28763480]
    [28583936, 28763480]
    [28583936, 28763480]
    [28583936, 28791632]
    [28763400, 19783312]
    [28763400, 19783312]
    [28791592, 19783312]

    首先得明白a对象里有什么,对象a是一个list,list中的每个元素都是一个指向某个对象的引用。

    浅拷贝

    c = copy.copy(a)的过程是,创建一个新的list对象c,将a中每个引用的值赋给对应的c中的引用,
    所以c的两个引用的值与a中两个引用的值相同

    深拷贝

    d = copy.deepcopy(a)的过程是,创建一个新的list对象d,将a中每个引用的值赋给对应d中的引用,
    在赋值之前,判断该引用所指向的对象是否为mutable对象,如果是,则创建一个该mutable对象的深拷贝,并将引用指向该对象,
    如果不是,则直接将a中的引用赋给d。

    简而言之,深拷贝与浅拷贝的区别在于当拷贝引用值时,是否需要拷贝引用值对应的对象

  • 相关阅读:
    增加增删改查按钮
    基于.net创建一份报表模块
    bootstrap 三层设计
    DI 依赖注入之StructureMap框架
    unit vs2017基于nunit framework创建单元测试
    Oracle彻底卸载
    sql 统计常用的sql
    Webserver asp配置及伪静态设置
    MVC ASP.NET MVC5使用Area区域
    VS 发布MVC网站缺少视图解决方案
  • 原文地址:https://www.cnblogs.com/xueguangfeng/p/Python_Shallow_Deep_Copy.html
Copyright © 2011-2022 走看看