7:python数据类型补充:集合、深浅复制

一、基础数据类型补充知识

1、fromkeys    将一个对象作为values分别复制给另一个对象,另一个对象里的元素作为keys[注意:此时作为values的元素地址相同,因为他们引用的是同一个地址,所以values相同。

dic=dict.fromkeys([1,2,3,4,5,6,],[])
print(dic)

 

结果:

对values  []  进行增加操作,每一个配置的是相同的元素

dic[1].append('努力!')

 

2、循环列表和字典时,不能删除元素或者键值对

如下:删除key中带’k'的,这种循环时删除键值对会报错,解决的方式是循环时,将key添加到新的列表,然后在遍历列表,将key及其对应的values值删除。

dic={'k1':'v1','k2':'v2','k3':'v3'}
for i  in dic.keys():
    if 'k' in i :
        del dic[i]
print(dic)

正确的解决方法:

dic={'k1':'v1','k2':'v2','k3':'v3'}
l=[]
for i  in dic.keys():
    if 'k' in i :
        l.append(i)
# print(dic)
for j in l :
    del dic[j]
    print(dic)

3、0、空字符串、空列表、空字典对应的布尔值都是False

tu1=(1)
tu2=(1,)
print(tu1,type(tu1))
print(tu2,type(tu2))

结果显示不加逗号,那么这个数据类型就是它元素的类型

 

 

二、集合

1、集合是可变的数据类型,但是它里面的元素是不可变的数据类型(所以集合不能作为字典的键)。集合里的元素无序、不重复,这是他的特点。

集合的两个特点:

          1)不重复,把一个列表转化成集合,就自动去重了

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

2、集合的方法:

1、集合的创建:

set1 = set({1,2,'barry'})
set2 = {1,2,'barry'}
print(set1,set2)  # {1, 2, 'barry'} {1, 2, 'barry'}

2、增加:add

set1 = set({1,2,'barry'})
set1.add('wyx')

updata

set1 = set({1,2,'barry'})
set2 = {3,2,'barrrrrry'}
set1.add('wyx')
set1.update('laoshi')

3、删除:set .pop    随机删除,返回被删除的元素

             Set .remove(‘  ‘)按元素删除,没有会报错

     清空集合:set.clear()

                Del  删除整个集合

set1 = {'alex','wusir','ritian','egon','barry'}

set1.remove('alex') # 删除一个元素
print(set1)

set1.pop() # 随机删除一个元素
print(set1)

set1.clear() # 清空集合
print(set1)

del set1 # 删除集合
print(set1)

 

   

4、集合不能修改:1、无序    2、元素不可变,改了就变了

5、查: 只能用for循环查

6、交集:

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2)  # {4, 5}
print(set1.intersection(set2))  # {4, 5}

 

 7、并集:union   |

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7}

print(set2.union(set1))  # {1, 2, 3, 4, 5, 6, 7}

 

8、差集:set1独有的,set2没有

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 - set2)  # {1, 2, 3}
print(set1.difference(set2))  # {1, 2, 3}

 

 9、反交集^   :除了共有的元素之外的元素集合

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

 

10、子集与超集

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}

print(set1 < set2)
print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。

print(set2 > set1)
print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。

11、frozenset不可变集合,让集合变成不可变类型。

s = frozenset('barry')
print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

 

 

三、深浅Copy

浅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来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

深copy

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

 

posted @ 2017-12-26 08:29  王二黑  阅读(211)  评论(0编辑  收藏  举报