Python 浅拷贝和深拷贝

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门


一.Python 浅拷贝和深拷贝前言

       何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,Python 开发项目的时候说不定你就能碰上这样的坑;

Python 浅拷贝和深拷贝

二.Python 普通的变量赋值

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

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

list1 = [1,2,3,4,5]
# 普遍的变量赋值
list2 = list1
print(id(list1))
print(id(list2))

# 修改列表list2的数据
list2.append(123)
print(list1)
print(list2)

'''
输出结果:
2251297055368
2251297055368
[1, 2, 3, 4, 5, 123]
[1, 2, 3, 4, 5, 123]

'''

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

Python 浅拷贝和深拷贝

三.Python 浅拷贝和深拷贝

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

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

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

Python 浅拷贝和深拷贝

1.Python 浅拷贝copy

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

import copy
spam = ['A', 'B', 'C', 'D']
# 使用浅拷贝
cheese = copy.copy(spam)
cheese[1] = 42
print(id(spam),spam)
print(id(cheese),cheese)

'''
输出结果:
57205555 ['A', 'B', 'C', 'D']
57208888 ['A', 42, 'C', 'D']
'''

2.Python 深拷贝deepcopy

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""


import copy
spam = ['A', 'B', 'C', 'D']
# 使用深拷贝
cheese = copy.deepcopy(spam)
cheese[1] = 42
print(id(spam),spam)
print(id(cheese),cheese)

'''
输出结果:
57205555 ['A', 'B', 'C', 'D']
57208888 ['A', 42, 'C', 'D']

'''

3.Python 浅拷贝和深拷贝区别

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

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

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

       示例代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

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)

'''
输出结果:
使用浅拷贝:
2179653046408 [[42, 'E'], 'B', 'C', 'D']
2179653046920 [[42, 'E'], 'B', 'C', 'D']
************************************************************
使用深拷贝:
2179653086728 [['A', 'E'], 'B', 'C', 'D']
2179653046408 [[42, 'E'], 'B', 'C', 'D']

'''

由此可见:

       如果列表或者字典没有包含子列表或者子字典的话,使用深拷贝或者浅拷贝效果都有一样;

       如果列表或者字典中存在子类的时候,只有深拷贝才会为所有的子类也重新分配内存,而浅拷贝只负责父对象,不考虑子对象!!


四.猜你喜欢

  1. Python 配置环境
  2. Python 变量
  3. Python 运算符
  4. Python 条件判断 if/else
  5. Python while循环
  6. Python break
  7. Python continue
  8. Python for循环
  9. Python 字符串
  10. Python 列表list
  11. Python 元组tuple
  12. Python 字典 dict
  13. Python 条件推导式
  14. Python 列表推导式
  15. Python 字典推导式

未经允许不得转载:猿说编程 » Python 浅拷贝和深拷贝
喜欢(4) 打赏

评论抢沙发

评论前必须登录!

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

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏