python浅拷贝和深拷贝的区别

发布时间:2021-08-27 15:42:29 作者:chen
来源:亿速云 阅读:252

这篇文章主要讲解了“python浅拷贝和深拷贝的区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python浅拷贝和深拷贝的区别”吧!

一.普通的变量赋值

我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下:

1

2

3

4

5

6

7

8

9

10

list1 = [1,2,3,4,5]

# 普遍的变量赋值

list2 = list1

print(id(list1))

print(id(list2))

 

# 修改列表list2的数据

list2.append(123)

print(list1)

print(list2)

输出结果:

1

2

3

4

2251297055368

2251297055368

[1, 2, 3, 4, 5, 123]

[1, 2, 3, 4, 5, 123]

注意:常规的变量赋值共享一个内存块,内存地址相同,一旦值发生改变,共享同一个内存地址的所有变量值都会发生改变,可以直接通过内置函数id()对比下内存地址即可!

python浅拷贝和深拷贝的区别

二.浅拷贝和深拷贝

在python开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下copy模块:

copy.copy() – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;

copy.deepcopy() – 深拷贝,重新分配内存,拷贝对象及其所有子对象;

python浅拷贝和深拷贝的区别

1.浅拷贝copy()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# !usr/bin/env python

# -*- coding:utf-8 _*-

"""

@Author:何以解忧

@Blog(个人博客地址): shuopython.com

@WeChat Official Account(微信公众号):猿说python

@Github:www.github.com

 

@File:python_copy.py

@Time:2019/10/27:25

 

@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

"""

 

import copy

spam = ['A', 'B', 'C', 'D']

# 使用浅拷贝

cheese = copy.copy(spam)

cheese[1] = 42

print(id(spam),spam)

print(id(cheese),cheese)

输出结果:

1

2

57205555 ['A', 'B', 'C', 'D']

57208888 ['A', 42, 'C', 'D']

2.深拷贝deepcopy()

1

2

3

4

5

6

7

import copy

spam = ['A', 'B', 'C', 'D']

# 使用深拷贝

cheese = copy.deepcopy(spam)

cheese[1] = 42

print(id(spam),spam)

print(id(cheese),cheese)

输出结果:

1

2

57205555 ['A', 'B', 'C', 'D']

57208888 ['A', 42, 'C', 'D']

3.浅拷贝和深拷贝区别

对于常规的字典或者列表使用copy模块的深拷贝或者浅拷贝,两者并没有区别!如果字典或者列表中还有包含有子类的话,使用copy模块的深拷贝和浅拷贝的话,结果就大不相同了:

copy.copy() — 重新分配内存,只拷贝父对象,不会拷贝对象内部的子对象;

copy.deepcopy() — 重新分配内存,拷贝对象及其所有子对象;

示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import copy

 

print("使用浅拷贝:")

spam = [['A','E'], 'B', 'C', 'D']

# 使用浅拷贝

cheese = copy.copy(spam)

cheese[0][0] = 42

print(id(spam),spam)

print(id(cheese),cheese)

print("***"*20)

 

print("使用深拷贝:")

spam = [['A','E'], 'B', 'C', 'D']

# 使用深拷贝

cheese = copy.deepcopy(spam)

cheese[0][0] = 42

print(id(spam),spam)

print(id(cheese),cheese)

输出结果:

1

2

3

4

5

6

7

使用浅拷贝:

2179653046408 [[42, 'E'], 'B', 'C', 'D']

2179653046920 [[42, 'E'], 'B', 'C', 'D']

************************************************************

使用深拷贝:

2179653086728 [['A', 'E'], 'B', 'C', 'D']

2179653046408 [[42, 'E'], 'B', 'C', 'D']

<span style="fon

感谢各位的阅读,以上就是“python浅拷贝和深拷贝的区别”的内容了,经过本文的学习后,相信大家对python浅拷贝和深拷贝的区别这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. python的浅拷贝与深拷贝有什么区别
  2. python列表--浅拷贝与深拷贝的区别

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:HTML中划分框窗有哪些常用的属性

下一篇:JS怎么返回满足给定条件的全部元素

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》