深浅copy以及赋值

对于字符串和数字而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

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

import copy

n1 = 10242048
#n1 = 'hahahaha'
#赋值
n2
= n1
#浅copy n3
= copy.copy(n1) #深copy
n4
= copy.deepcopy(n1)
print(id(n1),id(n2)) #打印内存地址
5787536 5787536
print(id(n1),id(i3))
5787536 5787536
print(id(n1),id(n4))
5787536 5787536

字典,列表,元组等进行赋值,深浅copy时,它们的内存地址变化是不一样的。

在赋值操作时,仅仅只是做了一个别名而已。因为字典的存储空间比字符串和数字要大很多,当你赋值给另一个变量的时候,按原来的方式copy一份独立的数据会浪费很多资源,

效率还会很低。

 

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

n1 = {'k1':1024,'k2':'koka','k3':['haha','xixi','hehe','houhou']}

n2 = n1
print(n2)
print(n1)
{'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k2': 'koka', 'k1': 1024}
{'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k2': 'koka', 'k1': 1024}
n1['k1']=2048
print(n2)
print(n1)
{'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k2': 'koka', 'k1': 2048}
{'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k2': 'koka', 'k1': 2048}
n1['k3'][0]='ajx'
print(n2)
print(n1)
{'k3': ['ajx', 'xixi', 'hehe', 'houhou'], 'k2': 'koka', 'k1': 2048}
{'k3': ['ajx', 'xixi', 'hehe', 'houhou'], 'k2': 'koka', 'k1': 2048}

#从结果可以发现n1和n2的值同时改变,因为他们只是两个不同的别名而已。

在浅copy操作时,只是copy了字典下的第一层数据,对于更深层次的数据还是原来的。

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

n3 =copy.copy(n1)
print(n3)
print(n1)
{'k1': 1024, 'k2': 'koka', 'k3': ['haha', 'xixi', 'hehe', 'houhou']}
{'k1': 1024, 'k2': 'koka', 'k3': ['haha', 'xixi', 'hehe', 'houhou']}
n1['k2'] = 'dada'
print(n3)
print(n1)
{'k1': 1024, 'k2': 'koka', 'k3': ['haha', 'xixi', 'hehe', 'houhou']}
{'k1': 1024, 'k2': 'dada', 'k3': ['haha', 'xixi', 'hehe', 'houhou']}
n1['k3'][2] = 'heihei'
print(n3)
print(n1)
{'k1': 1024, 'k2': 'koka', 'k3': ['haha', 'xixi', 'heihei', 'houhou']}
{'k1': 1024, 'k2': 'dada', 'k3': ['haha', 'xixi', 'heihei', 'houhou']}

#可以看出第一层的字符串数据改变了,而后面的列表还是同一个。

在深度copy操作时,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

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

n4 = copy.deepcopy(n1)
print(n4)
print(n1)
{'k2': 'koka', 'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k1': 1024}
{'k2': 'koka', 'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k1': 1024}
n1['k1'] = 8192
n4['k2'] = 'akok'
print(n4)
print(n1)
{'k2': 'akok', 'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k1': 1024}
{'k2': 'koka', 'k3': ['haha', 'xixi', 'hehe', 'houhou'], 'k1': 8192}
n1['k3'][0] = "lolo"
n4['k3'][1] = "lala"
print(n4)
print(n1)
{'k2': 'akok', 'k3': ['lala', 'xixi', 'hehe', 'houhou'], 'k1': 1024}
{'k2': 'koka', 'k3': ['lolo', 'xixi', 'hehe', 'houhou'], 'k1': 8192}

#真正的完全copy一份数据。

 

数据结构扩展

Collection系列

1、计数器(counter)

Counter是对字典类型的补充,用于追踪值的出现次数。

ps:具备字典的所有功能 + 自己的功能

c1 = collections.Counter('aabc')
c2 = collections.Counter(('a','b','c','a'))
print(c1)
Counter({'a': 2, 'b': 1, 'c': 1})
print(c2)
Counter({'a': 2, 'b': 1, 'c': 1})
#类似于c1 + c2
c1.update(c2)
print(c1)
Counter({'a': 4, 'b': 2, 'c': 2})
c1.subtract('a')
print(c1)
Counter({'a': 3, 'b': 2, 'c': 2})
#列出前几位
print(c1.most_common(2))
[('a', 3), ('b', 2)]
for i  in c2.elements():
#elements返回元素迭代器
    print(i)
b
a
a
c
View Code

相关文章:

  • 2022-12-23
  • 2021-08-11
  • 2021-12-29
  • 2022-01-27
  • 2021-07-02
  • 2021-09-06
  • 2022-03-08
  • 2021-08-21
猜你喜欢
  • 2021-08-24
  • 2022-12-23
  • 2018-01-29
  • 2021-09-20
  • 2022-12-23
  • 2022-01-02
相关资源
相似解决方案