• 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。

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

  • 相关阅读:
    对话框风格的窗口
    对话框
    Notification的功能与用法
    滚动视图(ScrollView)的功能与用法
    css----overflow(布局)
    css----display(显示) 与 Visibility(可见性)
    css----position(定位)
    Vue.js----router(路由)
    HTTP协议-Cookie和Session详解
    MySql 复制表命令
  • 原文地址:https://www.cnblogs.com/xueguangfeng/p/Python_Shallow_Deep_Copy.html
Copyright © 2020-2023  润新知