1 对于赋值运算,就是共同指向一个内存地址.将一个值赋予一个变量,那么它的内存地址同时也赋予了他,若是值是不可变类型,改变值,就会产生一个新值和新内存地址,
若是值是可变类型那么内存地址不会变.
s1 = 'alex' s2 = s1 print(s1,id(s1)) print(s2,id(s2))
结果:面试
当值是可变类型时app
s1 = [] s2 = s1 s2.append("a") print(s1,id(s1)) print(s2,id(s2))
结果:
2 浅层copy 拷贝第一层的数据独立,第二层及之后公用一个内存地址测试
#copy l1 = [1,2,3] l2 = l1.copy() l1.append(666) #在第一层里添加数据 print(l1,id(l1)) print(l2,id(l2)) l1 = [1,[22,33],2,3] l2 = l1.copy() l1[1].append(666) #在第二层添加数据 print(l1,id(l1)) print(l2,id(l2))
结果:spa
3 深层copy 要引用模块 import copy 对于深copy,不管多少层,在内存中都是两个独立的内存地址3d
import copy l1 = [1,[22,33,],2,3] l2 = copy.deepcopy(l1) l1.append(777) l1[1].append(666) print(l1,id(l1),id(l1[1])) print(l2,id(l2),id(l2[1]))
结果:code
4 面试题blog
l1 = [1,[1,2],2,3] l2 = l1[:] # 是浅copy l1[1].append(111) print(l1,l2) #l2 是什么?
结果:索引
5 在列表循环过程当中,若是删除数据,可能会报错,举例:内存
将下列数据中奇数位删掉rem
#方法一: l1 = [111,222,333,444,555] # 删掉奇数就是保留偶数,将偶数数据找到,建个新列表代替原来列表 l2 = [] for i in range(len(l1)): if i % 2 == 0: l2.append(l1[i]) l1 = l2 print(l1) #方法二: l1 = [111,222,333,444,555,666,777] # 经过切片的步长删掉奇数数据 del l1[1::2] print(l1)
#方法三 l1 = [111,222,333,444,555] # 将索引倒序找奇数位 这样删掉数据就不会影响前面元素的索引 for i in range(len(l1)-1,-1,-1): if i % 2 == 1: del l1[i] print(l1)
结果:
6 字典在循环过程当中,若是删掉数据也会报错
dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'} #不可变的数据类型:可哈希 # for i in dic: # if 'k' in i: # del dic[i] print(dic)
结果: 在迭代过程当中字典大小改变
对应方法dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'}
l1 = [] for i in dic:
if 'k' in i:
l1.append(i) for k in l1:
del dic[k]
print(dic)
结果; 在字典循环中不能改变字典,可是新建个列表,把要删除的数据放到列表里,在循环列表,再循环列表过程当中修改字典就不会报错.
7 数据类型转换 元祖变列表list(tuple) 列表变元祖 tuple(list)
#tuple <---> list l1 = [1,2,3] tu = tuple(l1) #将列表换成元祖 l2 = list(tu) #将元祖变成列表 print(tu,l2)
结果:
字典专属类型转换 能够变列表,元祖 可是元祖是不可变类型 通常转换成列表
dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'} print(list(dic.keys())) print(list(dic.values())) print(list(dic.items()))
结果:
8 集合
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),可是集合自己是不可哈希(因此集合作不了字典的键)的。
如下是集合最重要的两点:
去重,把一个列表变成集合,就自动去重了。
关系测试,测试两组数据以前的交集、差集、并集等关系。
9 集合的增。
set1 = {'alex','wusir','ritian','egon','barry'} set1.add('景女神') print(set1) #update:迭代着增长 set1.update('景女神') print(set1)
结果:
10 集合的删。
set1 = {'alex','wusir','ritian','egon','barry'} set1.remove('alex') # 删除一个元素 print(set1) set1.pop() # 随机删除一个元素 print(set1) set1.clear() # 清空集合 print(set1) del set1 # 删除集合 print(set1)
结果:
11 集合的交 并,反交 差集,超集和子集
交集 (& 或者 intersection)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 & set2) # {4, 5} print(set1.intersection(set2)) # {4, 5}
结果:
并集。(| 或者 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}
结果:
差集。(- 或者 difference)
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}
结果:
反交集。 (^ 或者 symmetric_difference)
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}
结果:
子集与超集
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超集。
结果:
frozenset不可变集合,让集合变成不可变类型。把一个可迭代的元素添加到集合 若是有重复元素,自动删掉.
s = frozenset('barry') print(s,type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
结果: