Python-深浅copy
Posted S前进的中浪S
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-深浅copy相关的知识,希望对你有一定的参考价值。
需要理解数据的存储过程:
数据在磁盘中的存储,是分两个区域的,一个是数据块,存放数据,一个是索引标记。数据的读取是通过索引标记来找到数据块的位置,从而找到数据。
1,先看赋值运算。
l1 = [1,2,3,[\'barry\',\'alex\']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, [\'barry\', \'alex\']] print(l2) # [111, 2, 3, [\'barry\', \'alex\']] l1[3][0] = \'wusir\' print(l1) # [111, 2, 3, [\'wusir\', \'alex\']] print(l2) # [111, 2, 3, [\'wusir\', \'alex\']]
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
2,浅拷贝copy。
l1 = [1,2,3,[\'barry\',\'alex\']] l2 = l1.copy() print(l1,id(l1)) # [1, 2, 3, [\'barry\', \'alex\']] 2380296895816 print(l2,id(l2)) # [1, 2, 3, [\'barry\', \'alex\']] 2380296895048 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, [\'barry\', \'alex\']] 2593038941128 print(l2,id(l2)) # [1, 2, 3, [\'barry\', \'alex\']] 2593038941896 l1[3][0] = \'wusir\' print(l1,id(l1[3])) # [1, 2, 3, [\'wusir\', \'alex\']] 1732315659016 print(l2,id(l2[3])) # [1, 2, 3, [\'wusir\', \'alex\']] 1732315659016
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
3,深拷贝deepcopy。
import copy l1 = [1,2,3,[\'barry\',\'alex\']] l2 = copy.deepcopy(l1) print(l1,id(l1)) # [1, 2, 3, [\'barry\', \'alex\']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, [\'barry\', \'alex\']] 2915377167048 l1[1] = 222 print(l1,id(l1)) # [1, 222, 3, [\'barry\', \'alex\']] 2915377167816 print(l2,id(l2)) # [1, 2, 3, [\'barry\', \'alex\']] 2915377167048 l1[3][0] = \'wusir\' print(l1,id(l1[3])) # [1, 222, 3, [\'wusir\', \'alex\']] 2915377167240 print(l2,id(l2[3])) # [1, 2, 3, [\'barry\', \'alex\']] 2915377167304
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变
4、其他操作
for循环:用户按照顺序循环可迭代对象的内容。
msg = \'老男孩python是全国范围内最好的python培训机构\' for item in msg: print(item) li = [\'alex\',\'银角\',\'女神\',\'egon\',\'太白\'] for i in li: print(i) dic = {\'name\':\'太白\',\'age\':18,\'sex\':\'man\'} for k,v in dic.items(): print(k,v)
enumerate:枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
li = [\'alex\',\'银角\',\'女神\',\'egon\',\'太白\'] for i in enumerate(li): print(i) for index,name in enumerate(li,1): print(index,name) for index, name in enumerate(li, 100): # 起始位置默认是0,可更改 print(index, name)
range:指定范围,生成指定数字。
for i in range(1,10): print(i) for i in range(1,10,2): # 步长 print(i) for i in range(10,1,-2): # 反向步长 print(i)
参考链接:http://www.cnblogs.com/jin-xin/articles/7562422.html
以上是关于Python-深浅copy的主要内容,如果未能解决你的问题,请参考以下文章