(一)浅复制

复制列表最简单的方式是使用内置类型的构造方法:

>>> l1 = [1, [2, 3], (4, 5)]
>>> l2 = list(l1)
>>> l2
[1, [2, 3], (4, 5)]
>>> l2 is l1
False
>>> l2 == l1
True

对于列表和其他可变序列来说,也可以使用[:]:

>>> l3 = l1[:]
>>> l3
[1, [2, 3], (4, 5)]
>>> l3 is l1
False
>>> l3 == l1
True

然而构造方法和[:]都是浅复制,其复制原理如下图所示:

在上面的列表中,有元素是可变的,这可能导致意想不到的问题:

比如我们现在执行语句 l1[1].remove(2)

其结果如下图:

对l1的remove操作同时会影响l2,

我们再试试对l2的的元素操作: l2[1] += [22],其结果如下:

同样的,对l2的操作影响l2.

当我们对l1里的元组进行+=操作后,结果如下:

对于元组来说,它本身是不可变序列, +=运算符创建了一个新元组,然后重新绑定给了变量l1[2], l1, l2中最后位置上的元组不是同一个对象

(二)深复制

默认浅复制没有什么问题,但是有时候我们需要深复制,copy模块提供了deepcopy和copy函数,它们可以为任意对象做深复制和浅复制

下面演示deepcopy和copy的区别:

先定义Bus类如下:

class Bus:
def __init__(self, passengers=None):
if passengers is None:
self.passengers = []
else:
self.passengers = list(passengers) def pick(self, name):
self.passengers.append(name) def drop(self, name):
self.passengers.remove(name)

然后在控制台使用copy和deepcopy分别对Bus类的实例进行操作:

>>> from Example8_8 import Bus
>>> import copy
>>> bus1 = Bus(['Alice', 'Bill', 'Claire', 'David'])
>>> bus2 = copy.copy(bus1)
>>> bus3 = copy.deepcopy(bus1)

我们让Alice从bus1下车:

>>> bus1.drop('Alice')

然后在查看bus2和bus3的乘客:

>>> bus2.passengers
['Bill', 'Claire', 'David']
>>> bus3.passengers
['Alice', 'Bill', 'Claire', 'David']

查看对象内存图我们可以明白其中的原理,

Alice下车前,对象内存图如下:

Alice下车后对象内存图如下:

Python 深浅复制的更多相关文章

  1. python 深浅复制与指针内存

    Python是一门非常好的语言,他的长处在于拥有巨大灵活性的同一时候也拥有无比的严谨性,其它语言规定了非常多语法.告诉你什么情况下,语法就是这种,而Python却用非常少的规定,延伸出非常多语法,有些 ...

  2. 2019-04-15 python深浅复制

    原作地址:https://www.cnblogs.com/xueli/p/4952063.html 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,pyth ...

  3. 【Python初级】由判定回文数想到的,关于深浅复制,以及字符串反转的问题

    尝试用Python实现可以说是一个很经典的问题,判断回文数. 让我们再来看看回文数是怎么定义的: 回数是指从左向右读和从右向左读都是一样的数,例如1,121,909,666等 解决这个问题的思路,可以 ...

  4. Python 字符串拼接、格式化输出、深浅复制

    拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...

  5. python基础学习之深浅复制的概念

    1.深浅复制 浅复制,python自带,深复制需要导入模块包 import copy 使用深浅复制,根据id不同写出他们的区别a = [1,2,3]b = [6,7,8]s1 = [a,b]print ...

  6. Python基础之列表深浅复制和列表推导式

    一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...

  7. python基础知识03-格式化输出和深浅复制

    VIM中HJKL可以上下左右移动光标. 格式化输出和深浅复制 1.字符串的拼接和格式化 sudo pip3 install ipython 安装 ipython 进入 字符串相加 str1 + str ...

  8. Python格式化输出和深浅复制

    字符串的四种拼接方法,常用格式化 deepcopy(深复制) bytes 和 bytearray 的基本用法 字符串拼接 使用 + 格式化字符串 使用join 用单引号内的字符来拼接,参数填一个整体 ...

  9. 小学生都能学会的python(深浅拷贝)

    小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...

随机推荐

  1. PyCharm2018激活码

    亲测可用: 来自:https://blog.csdn.net/u014044812/article/details/78727496

  2. eclipse的svn插件

    SVN插件下载地址及更新地址,你根据需要选择你需要的版本.现在最新是1.8.xLinks for 1.8.x Release:Eclipse update site URL: http://subcl ...

  3. Knowledge-Reserve

    Knowledge-Reserve ComputerOperatingSystem 编译 静态库&动态库(Linux) 静态链接&动态链接 内存 内联函数&宏 Static&a ...

  4. BZOJ 3053: The Closest M Points(K-D Tree)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1235  Solved: 418[Submit][Status][Discuss] Descripti ...

  5. Linux相关网络命令

    1.简述osi七层模型和TCP/IP四层模型 OSI七层模型 TCP/IP四层模型 2.简述iproute家族命令 ip命令: ip [OPTIONS] OBJECT {COMMAND|help} i ...

  6. PHP保存数组到数据库

    数组是 PHP 开发中使用最多的数据类型之一,对于结构化的数据尤为重要. 很多时候我们需要把数组保存到数据库中,实现对结构化数据的直接存储和读取. 其中一个案例就是,对于 Form 提交的多选 che ...

  7. Ruby中Enumerable模块的一些实用方法

    我在查看 Array 类和 Hash 类的祖先链的时候都发现了 Enumerable,说明这两个类都mixin了Enumerable模块.Enumerable模块为集合型类提供了遍历.检索.排序等方法 ...

  8. vs code 写C心得

    用命令行的话可能比较简单: g++ -o [目标文件名] [原文件名] 然后在当前路径下直接执行这个文件,查看程序执行结果 例如: g++ -o a.out test.cpp ./a.out 默认是a ...

  9. python学习笔记(一):基础知识点

    defaultdict函数将所有值初始化为指定类型 from collections import defaultdict a = defaultdict(int) a[0] '' python按照引 ...

  10. React with webpack

    //entry.js require("!style!css!./style.css"); require("./hello.jsx"); // documen ...