python的拷贝方法有:切片方法, 工厂方法, 深拷贝方法, 浅拷贝方法等。

几种方法都可以实现拷贝操作, 具体区别在于两点:1.代码写法不同。 2.内存地址引用不同

代码演示:

 import copy
li = ['li', [100, 200, 300]]
li_1 = li[:] # 切片方法
li_2 = list(li) # 工厂方法
li_3 = copy.copy(li) # 浅拷贝
li_4 = copy.deepcopy(li) # 深拷贝
print('li', li, 'id:', id(li))
print('li1', li_1, 'id:', id(li_1))
print('li2', li_2, 'id:', id(li_2))
print('li3', li_3, 'id:', id(li_3))
print('li4', li_4, 'id:', id(li_4)) # 运行结果
# li ['li', [100, 200, 300]] id: 47813336
# li1 ['li', [100, 200, 300]] id: 47814096
# li2 ['li', [100, 200, 300]] id: 47513768
# li3 ['li', [100, 200, 300]] id: 47508656
# li4 ['li', [100, 200, 300]] id: 56333696
# 可以看到id都不一样,说明他们指向的都不是同一个列表对象
# 将除深拷贝以外任意一个方法的‘100’,重新赋值为400, 再次运行结果为
li_2[1][0] = 400
print('li', li, 'id:', id(li))
print('li1', li_1, 'id:', id(li_1))
print('li2', li_2, 'id:', id(li_2))
print('li3', li_3, 'id:', id(li_3))
print('li4', li_4, 'id:', id(li_4))
# li ['li', [400, 200, 300]] id: 56332976
# li1 ['li', [400, 200, 300]] id: 56333736
# li2 ['li', [400, 200, 300]] id: 56033528
# li3 ['li', [400, 200, 300]] id: 56028416
# li4 ['li', [100, 200, 300]] id: 56333696
# 可以看到:只改变了一个列表而除deepcopy之外其他的列表对象都变成的‘400’
print('li', li, 'id:', id(li))
print('li1', li_1, 'id:', id(li_1))
print('li2', li_2, 'id:', id(li_2))
print('li3', li_3, 'id:', id(li_3))
print('li4', li_4, 'id:', id(li_4))

因为除deepcopy之外其它的拷贝方法都只是拷贝了列表中对象的引用,再开辟一块新的内存来储存,如果其中一个数据变了, 其他的也会跟着改变。

而deepcopy是拷贝的对象本身, 一旦拷贝过来, 则与之前的被拷贝者没有任何关系(自己改变与原来的数组无关,原来的数组改变与自己无关)

萧伯纳说:“你有一个苹果,我有一个苹果,彼此交换一下,我们彼此仍然是各有一个苹果;但是你有一种思,我有一种思想,彼此交换一下,才发现从不同角度看到的问题远比本身更深刻,所以多交流多沟通是我们提高自我能力的一种方式!!!

如果你有更好更简单的方法,请一定评论谢谢!!!

python的拷贝方式以及深拷贝,浅拷贝详解的更多相关文章

  1. 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解

     c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...

  2. 【C++】拷贝构造函数(深拷贝,浅拷贝)详解

    一.什么是拷贝构造函数  首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对 ...

  3. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

  4. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  5. 七牛云存储Python SDK使用教程 - 上传策略详解

    文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k  ...

  6. Python调用C/C++动态链接库的方法详解

    Python调用C/C++动态链接库的方法详解 投稿:shichen2014 这篇文章主要介绍了Python调用C/C++动态链接库的方法,需要的朋友可以参考下 本文以实例讲解了Python调用C/C ...

  7. 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装爬虫框架Scrapy(离线方式和在线方式)(图文详解)

    不多说,直接上干货! 参考博客 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装OpenCV(离线方式和在线方式)(图文详解) 第一步:首先,提示升级下pip 第二步 ...

  8. 【python】redis基本命令和基本用法详解

    [python]redis基本命令和基本用法详解 来自http://www.cnblogs.com/wangtp/p/5636872.html 1.redis连接 redis-py提供两个类Redis ...

  9. 基于Python对象引用、可变性和垃圾回收详解

    基于Python对象引用.可变性和垃圾回收详解 下面小编就为大家带来一篇基于Python对象引用.可变性和垃圾回收详解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. 变量不是盒子 在示例所示 ...

随机推荐

  1. 【RocketMQ源码学习】- 4. Client 事务消息源码解析

    介绍 > 基于4.5.2版本的源码 1. RocketMQ是从4.3.0版本开始支持事务消息的. 2. RocketMQ的消息队列能够保证生产端,执行数据和发送MQ消息事务一致性,而消费端的事务 ...

  2. 解决计算精度问题:BigDecimal

    BigDecimal类 BigDecimal所在包:java.math,不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成 ...

  3. 解决python中的Non-UTF-8 code starting with ‘\xbs4’ in file错误

    出现错误如下图: 主要原因为编辑python脚本使用的编辑器编码有问题.我使用的编辑器是notepad++,由于没有做Python语言编辑配置,默认使用的是ANSI编码(右下角位置有编码格式),如下: ...

  4. Go语言 (指针)

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...

  5. Scratch编程:贪吃鱼(十一)

    “ 上节课的内容全部掌握了吗?反复练习了没有,编程最好的学习方法就是练习.练习.再练习.一定要记得多动手.多动脑筋哦~~” 01 — 游戏介绍 这是一个小游戏,通过键盘的方向键控制着大鲨鱼追着吃掉海星 ...

  6. visual studio code 命令行创建发布一个项目

    安装vs core 打开按ctrl+~键打开终端 输入dir看看有什么文件,输入md Test 创建一个文件夹,选择文件后创建一个项目 输入dotnet可以查看信息 执行dotnet --help或者 ...

  7. spring-data-jpa模糊查询

    记录一条关于spring-data-jpa模糊查询的语句 方法一: @Query(value="select * from search_key a where a.key_name lik ...

  8. Docker3-Dockerfile创建镜像的方法(推荐docker file这种方法)

    一.镜像制作的方法 1.本地导入导出镜像 请参考:Docker 架构原理及简单使用 导出:docker save nginx >/tmp/nginx.tar.gz 导入:docker load ...

  9. redis持久化机制和内存管理

    redis持久化方式有两种:RDB方式和AOF方式 1.RDB方式:内存快照,在指定的时间间隔对数据进行快照存储,支持在客户端直接BGSAVE或者SAVE命令来创建一个内存快照,BGSAVE会fork ...

  10. Oracle——无法在查询中执行 DML 操作

    今天在调用Oracle Function遇到一个异常