Python 浅拷贝和深拷贝 - Python零基础入门教程

目录

  • 一.Python 浅拷贝和深拷贝前言
  • 二.Python 普通的变量赋值
  • 三.Python 浅拷贝和深拷贝
    • 1.Python 浅拷贝 copy
    • 2.Python 深拷贝 deepcopy
    • 3.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 开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下 copy 模块:

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

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

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 copyprint("使用浅拷贝:")
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 浅拷贝和深拷贝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF工具-seccomp-tools

seccomp-tools可以分析程序的seccomp状态,哪些被系统被禁用了安装 安装流程: sudo apt install gcc ruby-dev gem install seccomp-tools 之后便可直接分析程序的seccomp状态

Cloud一分钟 | 谷歌关闭社交平台;亚马逊云服务拿下10亿美元订单,劲敌微软败走麦城...

Hello,everyone:10月11日早,星期四,祝大家工作愉快!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习…

mino文件服务器删除文件,Spring-minio

Spring-minioMinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小&#…

CTF工具-gdb简介

gdb简介 gdb是 GNU 开发的一个Unix/Linux下强大的程序调试工具。 使用 gdb 进行程序调试之前,gcc编译选项加上 -g 选项来讲调试信息加到可执行文件里 一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你…

Python 递归函数 - Python零基础入门教程

目录 一.Python 递归函数案例 1.Python 递归函数案例一2.Python 递归函数案例二3.Python 递归函数案例三 二.Python 递归函数总结三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一个函数在函数体内部调用自己,这样的函数称为…

Cloud一分钟 | 云存储服务商​Egnyte获7500万美元E轮融资,高盛领投

Hello,everyone:10月12日早,星期五,祝大家工作愉快!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习…

vuex modules ajax,VUE项目爬坑---6、vuex的真正存在的意义是什么

VUE项目爬坑---6、vuex的真正存在的意义是什么一、总结一句话总结:a、【避免低效的数据传递】:当多个组件嵌套的时候,只能父子传递,那么中间的组件只能做传递数据之用,数据不是它用,它却传递数据&#xff0…

CTF工具-gdb插件peda,pwndbg安装

gdb插件peda安装 安装很简单,到github上面它的教程就有 地址:https://github.com/longld/peda 安装流程: $git clone https://github.com/longld/peda.git ~/peda $echo “source ~/peda/peda.py” >> ~/.gdbinit $echo “DONE! debug your program with gdb…

Python sys模块 - Python零基础入门教程

目录 一.Python sys 模块简介二.Python sys 模块使用三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在Python sys 模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数!关于 sys 模块在官网…

为什么阿里飞猪、滴滴、携程都被质疑滥用大数据杀熟?

技术本无罪,用的人多了,自然成为掩盖人性罪恶的根源。支撑「互联网」时代的大数据是如何一步一步沦落成利益的刽子手的?2018 年,「大数据杀熟」一词开始进入大众视野,且在互联网领域掀起了腥风血雨。近日,更…

电脑服务器传文件夹吗,服务器和电脑传文件夹吗

服务器和电脑传文件夹吗 内容精选换一换Model File:模型文件。单击右侧的文件夹图标,在后台服务器sample所在路径(工程目录/run/out/test_data/resnet-18/model)选择需要转化的模型对应的*.prototxt文件,并上传。Weight File:权重文件。请自行从https://…

BugkuCTF-MISC题1和0的故事

基础知识: PIL PIL是Python Imaging Library,它为python解释器提供了图像编辑功能。 PIL.Image.new()方法通过给定的模式和大小创建一个新图像。尺寸以(width,height)-tuple,以像素为单位。对于单波段图像,颜色作为单个值给出,对…

Python time 模块 - Python零基础入门教程

目录 一.前言二.Python time 模块常用函数介绍三.Python time 模块使用 1.Python time 模块获取时间2.Python time 模块自定义时间格式3.Python time 模块查看代码执行时间 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 Python time 模…

面趣 | 这道微软面试题你会吗?

参加 2018 AI开发者大会,请点击 ↑↑↑问面试题目:两个单词如果包含相同的字母,次序不同,则称为字母易位词(anagram)。例如,“silent”和“listen”是字母易位词,而“apple”和“aplee”不是易位词。请定义…

2003文件共享服务器搭建,用Windows Server 2003搭建安全文件服务器(2)

选择“使用自定义共享和文件夹权限”,点击自定义按钮之后弹出自定义权限设置界面。在这里可以根据需要对不同用户设置不同的权限,例如可以对 Administrators用户组设置完全控制以赋予所有管理员对该共享文件夹的全部管理权限,为Guest用户设置…

BugkuCTF-MISC题baby_flag.txt

下载附件得到一个压缩包baby_flag.zip 打开得到baby_flag.txt,直接点击打开发现乱码 通过010editor打开观察发现这是一个图片文件 将文件后缀改为.jpeg得到一张图片 通过binwalk -e …未分离出有价值的信息 在010editor发现有RAR压缩包的头 将这一部分数据复制…

Python random 模块 - Python零基础入门教程

目录 一.Python random 模块常用函数介绍二.Python random 模块使用三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 Python random 模块包括返回随机数的函数,可以用于模拟或者任何产生随机输出的程序。 一.Python random 模…

云漫圈 | 计数排序,你真的了解么?

参加 2018 AI开发者大会,请点击 ↑↑↑————— 第二天 —————————————————假定20个随机整数的值如下:9,3,5,4,9,1,2,7,8,1&…

BugkuCTF-MISC题blind_injection

下载附件 方法一: 下载用wireshark打开 题目说的是盲注,而注入一般都是走的http,直接导出http对象,再根据大小排序 得到flag 方法二: 若HTTP对象列表点击大小无反应 将其导出,命名为output 在文件夹里查…

ubuntu服务器ssh登录密码修改,Ubuntu-18.04 下修改root用户密码,安装SSH服务,允许root用户远程登录,安装vsftp服务器...

修改root用户密码打开终端,输入 sudo passwd root 指令:安装SSH服务ssh默认端口号是22,可以在/etc/ssh/sshd_config文件中修改查看服务器否开启:netstat -tlp启动服务:sudo /etc/init.d/ssh start重启服务:…