Python中赋值&浅拷贝&深拷贝的简单介绍(示例)


本文摘自php中文网,作者不言,侵删。

本篇文章给大家带来的内容是关于Python中赋值&浅拷贝&深拷贝的简单介绍(示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

一、定义解释

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

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

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

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

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

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

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

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

二、不可变对象

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

>>> 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元素时,不同的修改都只对最后一次修改生效,且互相影响,因为第二个元素列表只是简单的复制了其引用,修改任何一个浅拷贝,都会修改引用的内容。

3396782689-5b866370851d5_articlex.png

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

>>>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中的赋值、浅拷贝、深拷贝介绍

以上就是Python中赋值&浅拷贝&深拷贝的简单介绍(示例)的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python list有序吗

Python环境下安装mysqldb模块

Python怎么创建django

Python二级证书有用吗

Python unittest实现api自动化测试_Python

Python怎么安装运行

unity3d能用Python写吗

Python如何用于人工智能

Python数值类型有哪些

Python实现字符串逆序输出

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...