深浅拷贝的一些理解和练习

lst=[1,11,10,2,21]
lst
[1, 11, 10, 2, 21]
lst.sort(key=int)
lst
[1, 2, 10, 11, 21]
lst.sort(key=str)
lst
[1, 10, 11, 2, 21]
lst[0]
1
lst[1]
10
#(key=str),用key作比较,下面相当于内置的函数
#for x in len(lst):
#    if str(x[i])>int(x[i+1])
#       pass
lst.append('1.5')
lst
[1, 1.5, 2, 10, 11, '1.5', '1.5', '1.5']
lst.sort()

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-23-b7de4ff5ffae> in <module>
----> 1 lst.sort()

TypeError: '<' not supported between instances of 'str' and 'int'

lst.pop()
'1.5'
lst
[1, 1.5, 2, 10, 11, '1.5', '1.5']
lst.sort()

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-b7de4ff5ffae> in <module>
----> 1 lst.sort()

TypeError: '<' not supported between instances of 'str' and 'int'

lst.sort(key=str)
lst
[1, 1.5, '1.5', '1.5', 10, 11, 2]
lst.sort(key=int)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-67bb97e53cd1> in <module>
----> 1 lst.sort(key=int)

ValueError: invalid literal for int() with base 10: '1.5'

lst.sort(key=float)
lst
[1, 1.5, '1.5', '1.5', 2, 10, 11]
lst0=list(range(4))
lst2=list(range(4)) #内容虽然一样,但是地址是不一样的
print(lst0==lst2)
lst1=lst0 #地址复制
lst1[2]=10
print(lst0)
print(lst1)
print(lst2)
True
[0, 1, 10, 3]
[0, 1, 10, 3]
[0, 1, 2, 3]
lst0=[1,[2,3,4],5]
lst5=lst0.copy()
lst0
[1, [2, 3, 4], 5]
lst5
[1, [2, 3, 4], 5]
lst0==lst5
True
lst0[2]=5
lst0[1][1]=20
lst0[1][0]=30
lst0 #浅拷贝;[30,20,4]整体是一个地址,改一个,另一个引用同一个地址也会变,前已发动全身,故([1,2,3]*5)要非常谨慎
[1, [30, 20, 4], 5]
lst5
[1, [30, 20, 4], 5]
id(lst0)
4572609928
id(lst5)#内容完全一致,但是地址
4573317384
lst0=[1,[2,3,4],5]#深拷贝,将内容完全复制,[2,3,4]是一个地址,但是复制内容,生成另一个地址,复制内容
from copy import deepcopy
lst5=deepcopy(lst0)
lst0==lst5
True
lst0[2]=50
lst0==lst5
False
#lst=[1,2,3]
#lst1=lst   #同一个对象,将一个赋值给另一个
#lst2=lst.copy() #内容相同,不同对象,遇到引用类型不复制对象,复制地址
#lst3=copy.deepcopy(lst)#内容相同,不同对象遇到引用类型也会复制出不同的对象
​

猜你喜欢

转载自blog.51cto.com/14167037/2373871
今日推荐