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. lambda表达式已经成为了开发者必须要掌握的技能?

    lambda表达式 lambda表达式是什么 引用百度百科 “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的la ...

  2. 【转帖】处理器史话 | 这张漫画告诉你,为什么双核CPU能打败四核CPU?

    处理器史话 | 这张漫画告诉你,为什么双核CPU能打败四核CPU? https://www.eefocus.com/mcu-dsp/371324 2016-10-28 10:28 作者:付丽华预计 9 ...

  3. sync包 — 汇总

    sync包 package main; import ( "time" "fmt" ) func main() { //time.Time代表一个纳秒精度的时间 ...

  4. Response知识点小结

    HTTP协议: 1. 响应消息:服务器端发送给客户端的数据 * 数据格式: 1. 响应行 1. 组成:协议/版本 响应状态码 状态码描述 2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状 ...

  5. Java开发笔记(一百二十七)Swing的标签

    提起AWT的标签控件Label,那个使用体验可真叫糟糕,不但不支持文字换行,而且对中文很不友好,既可能把中文显示为乱码,还不支持博大精深的各种中文字体.所幸Swing的升级版标签JLabel在各方面都 ...

  6. Django框架之DRF get post put delete 使用简单示例 (利用序列化反序列化)

    路由配置 # 路由 from django.conf.urls import url from django.contrib import admin from app01 import views ...

  7. 关于类视图选择继承APIView还是工具视图(ListAPIView、CreateAPIView等等)

    APIView使用方法,直接继承APIView,get或者post请求.方法很简单1.先获取到要操作的数据,然后把数据放到serializer中序列化或者反序列化,最后return返回值(记得.dat ...

  8. 【微信小程序学习笔记】入门与了解

    [微信小程序学习笔记(一)] IDE 下载安装 下载地址 官方工具:https://mp.weixin.qq.com/debug/w … tml?t=1476434678461 下载可执行文件后,可按 ...

  9. PB 之多行标题报表

    第一种 1.添加一个text,将背景色选为非透明色:position中的layer,选为foreground,这样就可以拖动列宽了         2.在position属性标签页的width里,点右 ...

  10. vscode插件之背景插件(background)

    1.在插件tab搜索background 2.打开vscode的配置页 { "background.useDefault": false, "background.cus ...