讲词典的最终一片片,操作方式里头有位copy,只好借以提及了厚薄复本的相同,只不过这儿头除了许多值得称赞耐人寻味回去思索的小东西。
细细看,看完后,你一定会直呼:
先把包导呵呵,前面要加进。
import copy
为的是避免在看的你早已忘掉前面厚薄复本的范例,这儿拷贝过来看下。
下面预设的表达式a表达式有两个特征,是条目套条目,而并非单纯的1,2,3此种int类别,或是”abc”,”bcd”此种数组,那他们来看一看又有甚么相同。
那他们试下厚薄复本
只不过我也很迷糊,听完是并非想打我?然而
虽然很奇怪,但是聪明的我怎么会想不懂呢。
这个和内存的使用有很大关系。
首先当程式存在a和int 1的时候,系统就需要开辟出一块内存来存储这个值了。
看到没,表达式a和int 1是指向同两个内存地址,或是说表达式a指向存着整型1的内存地址。
当他们把a表达式给b的时候
糊了有木有,深复本怎么没有开新内存来存int 1。Python里头有两个概念叫做小整数池:(0 – 256)早已预先开辟好了内存空间,有且唯一,只要是你电脑里的Python程式要用这些数字,内存地址都一样。
只不过为的是省内存,不可能为的是相同的值大量开辟内存空间,所以只要相同,就会指向同一个内存地址。a = 1和 a = 2并并非修改1存在的内存地址,把2放进去,而是2会再开两个内存空间,有两个新的地址,然后表达式给a,就把a重新指向到2对应的内存地址。
1无论表达式给a,还是b,还是c,都是把abc指向1的内存地址,所以无论厚薄复本,改变a都不影响b。
所以,int,str等等的特性早已很明显了吧:一旦产生,不可改变。
而他们说,条目是可变的,因为至少知道append,可以动态添加就是可变。
他们来看呵呵。
我勒个去,怎么不一样呢?a并非应该指向条目[1,2,3]的内存地址吗?
多来几次看一看呢?每一次结果都不一样,哈哈哈
正所谓孙猴子“影子大法”,一把猴毛变出猴子一群,每个都一样,每个都要占个坑。
复本之前的变了或是复本后的变了,所谓的厚薄复本都没有意义。厚薄厚薄,你得有多层才有意义啊。
他们这样看
可以看出点差别了吧,浅复本包含的内存地址没变,深复本开辟了新的内存地址。
最终来看一看词典,就用“西天取经小队”词典来举例吧,这是两个双层词典的数据结构
词典本身就有两个copy操作方式,他们来看下
现在west_team_msg 和west_team_msg_2看起来一样,那么他们修改west_team_msg看下。
小白龙不需要那么多花里胡哨的信息,就给个描述就行,修改如下
我去,为甚么没跟着一起变?难道这个copy也是个深复本?
再看两个,西游记中悟空有几次金箍棒被妖精偷走了,那么他们把“金箍棒拿掉”
神奇的事情又发生了,拿掉west_team_msg的兵器,west_team_msg_2的兵器也没了。
这个copy只不过就是词典的浅复本,只能真正复本一份外层词典,内层词典指向的内存地址无法复本。
那么用上deepcopy呢,初始化west_team_msg