1. 列表和字典,直接赋值,都是浅拷贝,即赋值双方指向同一地址,因为 Python 对可变对象按引用传递。

>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> a[0] = 'apple'
>>> a
['apple', 2, 3]
>>> b
['apple', 2, 3]
>>>
>>>
>>> dic = {'a': 'apple', 'b': 'banbana'}
>>> dic2 = dic
>>> dic2
{'a': 'apple', 'b': 'banbana'}
>>> dic['b'] = 'blueberry'
>>> dic
{'a': 'apple', 'b': 'blueberry'}
>>> dic2
{'a': 'apple', 'b': 'blueberry'}

2. 对非嵌套的列表,使用完全切片[:], 工厂函数 list(),或者 copy.copy() 都是深拷贝。

>>> a = [1, 2, 3]
>>> b = list(a)
>>> c = a[:]
>>> import copy
>>> d = copy.copy(a)
>>>
>>> a[0] = 'apple'
>>> a
['apple', 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]

3. 对于非嵌套的字典,使用工厂函数 dict(),或者 copy.copy() 都是深拷贝。

>>> dic = {'a': 'apple', 'b': 'banana'}
>>> dic2 = dict(dic)
>>> import copy
>>> dic3 = copy.copy(dic)
>>>
>>> dic['b'] = 'blueberry'
>>> dic
{'a': 'apple', 'b': 'blueberry'}
>>> dic2
{'a': 'apple', 'b': 'banana'}
>>> dic3
{'a': 'apple', 'b': 'banana'}

4. 对于嵌套的列表,嵌套的字典,只能使用 copy.deepcopy() 实现深拷贝。

>>> import copy
>>>
>>> a = [1, 2, ['apple']]
>>> b = copy.deepcopy(a)
>>> a[2][0] = 'watermelon'
>>> a
[1, 2, ['watermelon']]
>>> b
[1, 2, ['apple']]
>>>
>>>
>>> dic = {'a': 'apple', 'b': {'b1': 'banana', 'b2': 'blueberry'}}
>>> dic2 = copy.deepcopy(dic)
>>> dic['b']['b1'] = 'bukeneng'
>>> dic
{'a': 'apple', 'b': {'b1': 'bukeneng', 'b2': 'blueberry'}}
>>> dic2
{'a': 'apple', 'b': {'b1': 'banana', 'b2': 'blueberry'}}

5. 对于嵌套可变对象的元组,只有 copy.deepcopy() 实现深拷贝。

>>> import copy
>>>
>>> t = (1, 2, ['apple'])
>>> t2 = t
>>> t3 = tuple(t)
>>> t4 = copy.copy(t)
>>> t5 = copy.deepcopy(t)
>>>
>>> t[2][0] = 'watermelon'
>>> t
(1, 2, ['watermelon'])
>>> t2
(1, 2, ['watermelon'])
>>> t3
(1, 2, ['watermelon'])
>>> t4
(1, 2, ['watermelon'])
>>> t5
(1, 2, ['apple'])

完。

Python 中的浅拷贝和深拷贝的更多相关文章

  1. python中的浅拷贝,深拷贝

    直接引用,间接引用 # 1.列表存储的是索引对应值的内存地址,值会单独的开辟一个内存空间 list = ["a","b"] 内存里面存储的就是list[0],l ...

  2. python中的浅拷贝和深拷贝

    1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...

  3. 16.python中的浅拷贝和深拷贝

    在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b

  4. Python中的浅拷贝与深拷贝

    编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...

  5. (转+原)python中的浅拷贝和深拷贝

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...

  6. Python中的赋值、深拷贝与浅拷贝(内存地址)

    Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...

  7. 【转】JAVA中的浅拷贝和深拷贝

    原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...

  8. python中的浅拷贝与赋值不同

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  9. Python 引用、浅拷贝、深拷贝解析

    引用 Python是动态数据类型的语言,故在对变量进行赋值时是不用制定变量类型的. 或者说,你可以把变量赋值的过程,当作是贴一个标签,去引用该数据. 看下面的例子: In [54]: a=4 In [ ...

随机推荐

  1. Sql 判断函数是否存在、sql判断表是否存在、sql判断存储过程是否存在、sql判断视图是否存在

    --数据库是否存在 IF exists(SELECT * FROM master..sysdatabases WHERE name=N'库名') PRINT 'exists' ELSE PRINT ' ...

  2. 6个小而美的es6新特性

    译者:动静若参商 译文:http://www.zcfy.cc/article/1795 原文:https://davidwalsh.name/es6-features JavaScript社区中的每个 ...

  3. js判断当前内容是否为空

    function isValue(o) { return (this.isObject(o) || this.isString(o) || this.isNumber(o) || this.isBoo ...

  4. Django之django模型层二多表操作

    一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...

  5. BDD实战篇 - .NET Core里跑Specflow - 可以跑集成测试和单元测试

    这是<如何用ABP框架快速完成项目 >系列中和DevOps系列文章其中一篇文章.   BDD很赞!比TDD先进很多,能够大大提高编码效率.   上一篇文章说了如何在.NET Core里安装 ...

  6. OpenVDB for Mitsuba

    https://github.com/zhoub/mitsuba-vdb

  7. python特性--property

    在定义一个类的时候,有时我们需要获取一个类的属性值,而这个属性值需要经过类中的其他属性运算来获得的.那么很容易,只要我们在类中定义一个方法,并且通过调用方法可以获取到那个需要运算的属性值.那么,问题来 ...

  8. 算法:输入一个链表,输出该链表中倒数第k个结点。

    算法:输入一个链表,输出该链表中倒数第k个结点.<剑指offer> 思路加到注释里面了: 1:两个if判断是否返回值为空,首个为空,没有第k个值: 2:for循环找到倒数第k个值,返回为a ...

  9. TTS 文字转语音 ekho

    1.源码下载 使用svn客户端,执行如下命令下载 svn co https://svn.code.sf.net/p/e-guidedog/code/ 2.官方网站查看说明 http://www.egu ...

  10. 解决tomcat中文传输乱码问题

    <Connector URIEncoding="utf-8" connectionTimeout="20000" encoding="utf-8 ...