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的主要内容,如果未能解决你的问题,请参考以下文章

Python之深浅copy

python 06 id is == set 深浅copy

python之数据类型补充集合深浅copy

Python的深浅copy

python列表中的深浅copy

我要学python之深浅拷贝原理