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)

浙公网安备 33010602011771号