python深浅拷贝
字节与字符串的关系:8byte = 1kb,字节是计算机内的最小单位,字符串是能看到的最小单位
list的特殊情况
li1 = [11,22,33,44,55] #循环删除,每一个元素 for i in range(leng(li1)) : del li1[i] print(i) print(li1) $列表分配索引超出范围 0 [22, 33, 44, 55] 1 [22, 44, 55] 2 [22, 44] $IndexError: list assignment index out of range 分析原因: 第一次循环当i等于0时删除索引为0的元素22,列表变为[22, 33, 44, 55] 第二次循环当i等于1时删除索引为1的元素33,列表变为[22, 44, 55] 第三次循环当i等于2时删除索引为2的元素55,列表变为[22, 44] 第四次循环当i等于3时删除索引为3的元素不存在,报错 列表可变每次删除元素,列表都发生变化,导致出现上面问题
删除列表方法:
1.采用倒序删除法
li1 = [11,22,33,44,55] for i in range(len(li1)-1,-1,-1) : del li1[i] print(li1)
2.使用深拷贝先定义范围,再循环删除
lis = [11,22,33,44,55]
import copy
for i in copy.deepcopy(lis) :
lis.remove(i)
print(lis)
习题:删除列表奇数位(二种方法)
li1 = [11,22,33,44,55] li1 = li1[1::2] print(li1) $[22, 44]
li1 = [11,22,33,44,55]
for i in range(len(li1)-1,-1,-2) :
del li1[i]
print(li1)
$[22, 44]
分析题:
lis = [11,22,33,44,55] for i in lis : lis.pop() print(lis) $[11,22] $为什么不会全部删除 $第一次进入循环i等于11,删除最后一个元素55,列表变为[11,22,33,44] $第二次进入循环i等于22,删除最后一个元素44,列表变为[11,22,33] $第三次进入循环i等于33,删除最后一个元素33,列表变为[11,22] $第四次进入循环列表元素改变,不会再次循环
这样可以解决问题
for i in range(len(lis)) :
lis.pop()
print(lis)
dict的特殊情况
#dict.fromkeys(seq[,value]) dict1 = dict.fromkeys('asdfasdf]') ${'a': None, 's': None, 'd': None, 'f': None, ']': None} #易范错误 dic = dict.fromkeys([1,2,3],'春哥') dic = dict.fromkeys([1,2,3],[]) print(dic) ${1:[],2:[],3:[]) dic[1].append('abc') dic[2].extend('二哥') ${1: ['abc', '二', '哥'], 2: ['abc', '二', '哥'], 3: ['abc', '二', '哥']}
字典的删除
#循环删除字典中键中包含'K‘的键值对(两种方法) dic1 = {'k1':'v1','k2':'v2','a3':'v3'} li1 = [] for key,value in dic1.items() : if 'k' not in key : li1.append({key:value}) print(li1) #能过列表操作字典 dic1 = {'k1':'v1','k2':'v2','a3':'v3'} li1 = [] for key in dic1 : if 'k' in key : li1.append(key) for i in li1 : del dic1[i] print(dic1)
基本数据类型bool值为False的情况
print(bool(0),bool(''),bool([]),bool(()),bool({}),bool(set())) $False False False False False False
集合
可变的数据类型,集合元素必须是不可变数据类型,无序,集合自动去重复
基本操作: set1 = set({1,2,3}) set2 = set{1,2,3,[2,3],{'name':'alex'}} 错 print(set1) 打印无序 增 set.add('') set.update('') 删 set.pop 随机删除,有返回值 set.remove 按元素删除,没有元素报错 set.clear() 清空列表 $set() 空集合,{}空字典 del set 整删除,报错 改 不可变数据类型,无序不能改 for i in set: print(i)
比较方法:
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} #交集 & set3 = set1 & set2 #并集(所有元素) | union(联合) set3 = set1 | set2 #反交集 ^ symmetric_difference set3 = set1 ^ set2 #差集 第一个集合独有 set3 = set1 - set2 #子集和超集 < issubset issuperset
集合方法:
集合本身是可变数据类型,可以使用frozense()将集合冻住
深浅拷贝
l1 = [1,2,3] l2 = l1 l1.append('a') print(l1,l2) #浅拷贝copy l1 = [1,2,3] l2 = l1.copy() print(l1,l2,l1 is l2) l2.append('a') print(l1,l2) l1 = [1,2,[4,5,6],3] l2 = l1.copy() print(l1,l2,l1 is l2) l2.append('a') print(l1,l2) l1[2].append('a') print(l1,l2) print(id(l1[2]),id(l2[2])) #深拷贝copy #import coyp l1 = [1,2,3] l2 = copy.deepcopy(l1)
枚举类型enumerate
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
enumerate(sequence, [start=0])
li = ['a','b','c','d'] for index,value in enumerate(li) : print(index,value) #数字列可以设置开头列 for index,value in enumerate(li,100) : print(index,value)