列表中的赋值和平常的赋值是不一样的,看下面的代码:
In [1]: a = 1

In [2]: b = a

In [3]: a
Out[3]: 1 In [4]: b
Out[4]: 1 In [5]: id(a)
Out[5]: 4452948992 In [6]: id(b)
Out[6]: 4452948992 In [7]: id(1)
Out[7]: 4452948992 In [8]: a = 4 In [9]: b
Out[9]: 1 In [10]: id(a)
Out[10]: 4452949088 In [11]: id(b)
Out[11]: 4452948992 In [12]: id(1)
Out[12]: 4452948992
在这段代码中,a = 1,a指向内存地址;b = a,b也指向内存地址1,所以当a指向内存地址4的时候,b的值不变,因为b指向的内存地址是1而不是a。
在列表中就不一样了,下面介绍列表的深浅copy
 
1.直接赋值
In [1]: li = [1,2,3]

In [2]: n = li

In [3]: li
Out[3]: [1, 2, 3] In [4]: n
Out[4]: [1, 2, 3] In [5]: li[0] = 'a' In [6]: li
Out[6]: ['a', 2, 3] In [7]: n
Out[7]: ['a', 2, 3] In [8]: id(li)
Out[8]: 4342626376 In [9]: id(n)
Out[9]: 4342626376 In [10]: id([1,2,3])
Out[10]: 4440762824
可以看出,在列表中,n是指向了li的内存地址, 不是列表[1,2,3]了,所以li的值变化的话,n也跟着变化。可以想象成li和n都指向了一个水杯,水杯里有三块白糖,把其中一块换成了黑糖,
那不管是用li还是n,水杯里现在都是有两块白糖和一块黑糖。 2.浅copy
In [1]: li2 = [1,2,3,['alex',27]]

In [2]: n2 = li2.copy()

In [3]: li2
Out[3]: [1, 2, 3, ['alex', 27]] In [4]: n2
Out[4]: [1, 2, 3, ['alex', 27]] In [5]: id(li2),id(n2)
Out[6]: (4536317192, 4536271560) In [6]: li2[0] = 'a' In [7]: li2
Out[7]: ['a', 2, 3, ['alex', 27]] In [8]: n2
Out[8]: [1, 2, 3, ['alex', 27]] In [9]: id(li2[0]),id(n2[0])
Out[9]: (4509371784, 4506651648)
两个列表的内存地址(id)是不一样的,说明n2重新开辟了一片内存,所以当li2里面的元素改变后,n2里的元素并没有改变。
下面就不一样了
In [10]: li2[3][0] = '帅哥'

In [11]: li2
Out[11]: ['a', 2, 3, ['帅哥', 27]] In [12]: n2
Out[12]: [1, 2, 3, ['帅哥', 27]] In [13]: id(li2[3]),id(n2[3])
Out[13]: (4536316872, 4536316872) In [15]: id(li2[3][0])
Out[15]: 4536362680 # 和li2[3]的内存地址不一样
li2[3]和n2[3]的内存地址是一样的,还是共享一个内存地址,所以一个跟着改变,另一个也会跟着变,要想解决这个问题就要用到深copy了
 
4.深copy(不太常用)
In [1]: import copy

In [2]: li3 = [1,2,3,['alex',27]]

In [3]: n3 = copy.deepcopy(li3)

In [4]: li3
Out[4]: [1, 2, 3, ['alex', 27]] In [5]: n3
Out[5]: [1, 2, 3, ['alex', 27]] In [6]: li3[3][0] = '帅哥' In [7]: li3
Out[7]: [1, 2, 3, ['帅哥', 27]] In [8]: n3
Out[8]: [1, 2, 3, ['alex', 27]]
可以看出,等于是完全copy了一份,除非特殊场景这个方法不常用,也不建议用,因为如果列表存的数据量特别大的话,这样深copy一份直接翻一倍,浪费空间。

python列表中的深浅copy的更多相关文章

  1. 如何在python列表中查找某个元素的索引

    如何在python列表中查找某个元素的索引 2019-03-15 百度上回复别人的问题,几种方式的回答: 1) print('*'*15,'想找出里面有重复数据的索引值','*'*15) listA ...

  2. python学习笔记三 深浅copy,扩展数据类型(基础篇)

    深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...

  3. python基础(三)编码,深浅copy

    编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...

  4. 总结day6 ---- set集合,基本类型的相互转化,编码,数据类型总结,循环时候不要动列表或者字典,深浅copy

    python小数据池,代码块的最详细.深入剖析   一. id is == 二. 代码块 三. 小数据池 四. 总结 一,id,is,== 在Python中,id是什么?id是内存地址,比如你利用id ...

  5. python之集合,深浅copy

    一. 集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...

  6. python 列表中[ ]中冒号‘:’的作用

    中括号[ ]:用于定义列表或引用列表.数组.字符串及元组中元素位置 list1 = [, ] list2 = [, , , , , , ] print ] print :]   冒号: 用于定义分片. ...

  7. python列表中的pop函数

    再python的列表中,有许多的内置方法,而在这里我主要向大家介绍一下pop函数. pop函数主要是用于删除列表中的数据.而其删除值时会返回删除的值.如果没有参数传入时, 则会默认认为删除列表的最后一 ...

  8. python列表中中文编码的问题

    在python2列表中,有时候,想打印一个列表,会出现如下显示: 这个是由于: print一个对象,是输出其“为了给人(最终用户)阅读”而设计的输出形式,那么字符串中的转义字符需要转出来,而且 也不要 ...

  9. Python列表中的字典按照该字典下的键值进行排序

    列表中的字典按照该字典下的键值进行排序 这算是排序中比较复杂的一种情况吧,多重嵌套,按照某种规则进行排序.如下面这个json(注:这里这是该列表中的一个项): [ { "stat" ...

随机推荐

  1. java--时间日期用法

    转载大神 https://www.cnblogs.com/Mr-Lyu/p/5736152.html https://blog.csdn.net/yf198708/article/details/51 ...

  2. VS Code开发调试.NET Core 2.0

    VS Code开发调试.NET Core 2.0 使用VS Code 从零开始开发调试.NET Core 2.0.无需安装VS 2017 15.3+即可开发调试.NET Core 2.0应用. VS ...

  3. RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例

    你是否听说过或者使用过队列? 你是否听说过或者使用过消息队列? 你是否听说过或者使用过RabbitMQ? 提到这几个词,用过的人,也许觉得很简单,没用过的人,也许觉得很复杂,至少在我没使用消息队列之前 ...

  4. Jquery3

    动画 动画动画效果一:show(时间),hide(时间)说明:时间的单位为毫秒方法toggle(时间):使用动画切换显示与隐藏动画效果二:slideDown(时间),slideUp(时间)切换:sli ...

  5. 【Unity3D】资源对象、预设、查找对象、组合模式等知识点

    1.解释对象与资源区别于联系,根据官方案例,分别总结资源和对象组织的规则/规律.    下载并查看了Adam和Survival Shooter tutorial两个官方资源案例,这些案例作为资源,可以 ...

  6. 3D图形引擎决定三维产业差异化

    从2009年中国3D产业初步兴起开始,短短几年间中国的3D技术得到了飞速的发展,3D打印机.3D投影仪.Web3D.虚拟现实.场景漫游等等产业应用应运而生,设备制造商和内容提供商都开始发挥自主创新的优 ...

  7. iOS - NSString 封装

    在实际项目开发过程中,发现字符串使用频率还是非常高的,NSString提供了很多相关的API,但是在开发过程中发现很多业务功能都是相同的.因此根据在开发过程中遇到的字符串使用场景,进行了简单封装.具体 ...

  8. ArcServer10.1系列产品之ArcGIS Web Adaptor (IIS)

    1.关于 ArcGIS Web Adaptor 通过 ArcGIS Web Adaptor,可以将 ArcGIS for Server 与您现有的 Web 服务器进行集成.ArcGIS Web Ada ...

  9. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  10. SQL Server 查询性能优化——创建索引原则

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...