列表中的赋值和平常的赋值是不一样的,看下面的代码:
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. Win10专业版系统下添加其他国家语言

    Win10专业版系统下如何添加其他国家语言?国内的win10专业版系统默认情况下是安装简体中文,但是有的用户出于工作原因需要使用其它字体.比如外国友人就需要使用英语,西班牙等.其实win10专业版是支 ...

  2. airodump-ng 界面参数比较详细的解释

    BSSID: AP(access point)的MAC地址,,如果在client section中BSSID显示为"not associated" ,那么意味着该客户端没有和AP连 ...

  3. PT100/PT1000

    热敏电阻:互换性差,非线性严重,测量范围窄-50~300℃. 金属电阻:准备稳定可靠.-200~500℃ PT100:测量范围宽比PT1000宽,分辨率比PT1000低(100倍,即PT1000每变化 ...

  4. js解析url参数

    1.采用正则,这也是现在使用最为方便的 function getQueryString(name) { const reg = new RegExp("(^|&)" + n ...

  5. 获取jqGrid中选择的行的数据

    下面可以获取选择一行的id,如果你选择多行,那下面的id是最后选择的行的id: var id=$(‘#gridTable’).jqGrid(‘getGridParam’,'selrow’); 如果想要 ...

  6. c#基础值类和引用类型

    //值类型:int double char decimal bool enum struct //引用类型:string 数组 自定义类 集合 object 接口 值传递传递的值得本身 引用传递传递的 ...

  7. 重写FileUpload控件让它可以显示上传后的文件名

    我在以前的开发中经常遇到这样的场景:文件上传之后需要显示文件名,但是asp.net自带的fileupload是不能付给上传后的文件名值的. 以前都是做一个label显示的,今天想起来了,写个控件封装一 ...

  8. 【Design Patterns】监听器模式

    监听器模式 监听器模式其实是观察者模式中的一种,两者都有关于回调的设计. 与观察者模式不同的是,观察者模式中存在的角色为观察者(Observer)和被观察者(Observable) 而监听器模式中存在 ...

  9. JavaScript 事件对象event

    什么是事件对象? 比如当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象. 注:事件通常与函数结合使用,函数不会在事件发生前被执 ...

  10. [总结] min-25筛

    再不写总结我又会忘掉啊啊啊啊啊啊啊啊啊 这个\(min-25\)筛主要用来求一个积性函数的前缀和,就像这样\[\sum_{i=1}^n f(i)\] 不过这个积性函数要满足两个条件:质数\(p\)的函 ...