视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中赋值&浅拷贝&深拷贝的简单介绍(示例)
2020-11-27 14:11:49 责编:小采
文档
 本篇文章给大家带来的内容是关于Python中赋值&浅拷贝&深拷贝的简单介绍(示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在写dict数据类型时,有提到过“赋值语句”与copy()函数。
其实说到深浅拷贝,需要考虑具体的数据类型。一部分是不可变对象,如数字、字符串;另一部分是可变对象,如列表、字典等

一、定释

  • 变量:一个系统表的元素,指向对象的连接空间。

  • 对象:被分配的一块内存,存储其实际的值。

  • 引用:从变量到对象的指针。

  • 不可变对象:一旦创建就不可以修改,如数字、字符串、元组。

  • 可变对象:可以修改的对象,如列表、字典。

  • 赋值:通过语句“=”实现。左边是新建的变量,右边可以是直接内容,或者已存在的变量。是对象的引用,Python没有拷贝该对象,只是拷贝了对象的引用,新变量指向源变量内存地址。

  • 浅拷贝:对一个对象进行拷贝。拷贝最外围的对象本身,内部的元素都只是拷贝了一个引用而已。即新创建了一个类型跟原对象一样、内容是原对象的引用。【浅拷贝对象是新的,对象的引用内容是旧的。】
    浅拷贝实现的几种方式:(1)切片:[:];(2)工厂函数,比如list()、dict();(3)使用copy()。

  • 深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。即把对象复制一遍,并且该对象中引用的其他对象也复制。

  • 二、不可变对象

    对于不可变对象,例如数字和字符串而言,赋值(=)、浅拷贝(copy())和深拷贝(deepcopy())没有区别,因为他们的对象引用永远指向同一个内存地址。
    通过例子演示:

    >>> var_1 = 123
    >>> id(var_1) # 通过id()查看地址
    1615552144
    >>> var_2 = var_1
    >>> id(var_2)
    1615552144
    >>>
    >>> import copy # 浅、深拷贝需要导入copy模块
    >>> var_3 = copy.copy(var_1)
    >>> id(var_3)
    1615552144
    >>>
    >>> var_4 = copy.deepcopy(var_1)
    >>> id(var_4)
    1615552144

    你会发现var_1 ~ var_4 的id指向是一样的。

    三、可变对象

    对list、dict等数据类型而言,赋值、浅拷贝和深拷贝,他们对内存地址的变化是不同的。
    赋值浅拷贝:值相等,地址相等;
    copy浅拷贝:值相等,地址不相等;
    deepcopy深拷贝:值相等,地址不相等;

    例子一:
    base[0]=’name’,是一个string,不可变对象;base[1]=[‘age’,18],是list,可变对象。
    base_1、base_2均是base的浅拷贝,三者id()一样。
    当对第一个string元素进行不同的更改时,发现id各不相同,不会互相影响,因为字符串(不可变)被显示的拷贝,当修改后,新创建了一个字符对象。
    而修改第二个list元素时,不同的修改都只对最后一次修改生效,且互相影响,因为第二个元素列表只是简单的复制了其引用,修改任何一个浅拷贝,都会修改引用的内容。

    例子二:深拷贝
    创建一个字典对象,并使用深拷贝创建一个新的对象。

    >>>import copy
    >>> var = {"a":1,"b":2,"c":[3,'abc']}
    >>> var1 = copy.deepcopy(var)
    >>> id(var),id(var1)
    (17616992, 15671136) # 地址不相同
    >>> id(var['c']),id(var1['c'])
    (15695144, 15695384) 
    >>> id(var['c'][0]),id(var1['c'][0])
    (1615550224, 1615550224) # ‘c’元素的内存地址是相同的
    >>>
    >>> var1['c'][0] = 4
    >>> var
    {'a': 1, 'b': 2, 'c': [3, 'abc']}
    >>> var1
    {'a': 1, 'b': 2, 'c': [4, 'abc']}
    >>> id(var['c'][0]),id(var1['c'][0])
    (1615550224, 1615550240) # 对var1的修改没有影响var

    相关推荐:

    整理Python中的赋值运算符

    Python中的赋值、浅拷贝、深拷贝介绍

    下载本文
    显示全文
    专题