集合及深浅copy

集合set={}               

集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

1.去重,把一个列表变成集合,就自动去重了。

2.关系测试,测试两组数据之前的交集、差集、并集等关系。

深浅copy

1.赋值运算

# l1 = [1,2,3,['cat','dog']]
# l2=l1
# l1[0]=4

#print(l1) = [4, 2, 3, ['cat', 'dog']]
#print(l2) = [4, 2, 3, ['cat', 'dog']]

# l1[3][0]='big'
# print(l1) = [1, 2, 3, ['big', 'dog']]
# print(l2) = [1, 2, 3, ['big', 'dog']]
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。


2.浅copy

# l1 = [1,2,3,['cat','dog']]
# l2=l1.copy()

# print(l1,id(l1))=[1, 2, 3, ['cat', 'dog']] 35482376
# print(l2,id(l2))=[1, 2, 3, ['cat', 'dog']] 35523464

# l1[0]=5
# print(l1,id(l1[0)=[5, 2, 3, ['cat', 'dog']] 1564828000
# print(l2,id(l1[0])=[1, 2, 3, ['cat', 'dog']]1564827872

# l1[3][1]=5
# print(l1,id(l1[3][1]))=[1, 2, 3, ['cat', 5]] 1564828000
# print(l2,id(l2[3][1]))=[1, 2, 3, ['cat', 5]] 1564828000
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性.

3.深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来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。




 


 
 
 
 
原文地址:https://www.cnblogs.com/liusouthern/p/8086410.html