python深浅拷贝

字节与字符串的关系:8byte = 1kb,字节是计算机内的最小单位,字符串是能看到的最小单位

list的特殊情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
2
3
4
1.采用倒序删除法<br>li1 = [11,22,33,44,55]
for i in range(len(li1)-1,-1,-1) :
    del li1[i]
print(li1)<br>2.使用深拷贝先定义范围,再循环删除lis = [11,22,33,44,55]<br>import copy<br>for i in copy.deepcopy(lis) :<br>   lis.remove(i)<br>print(lis)

习题:删除列表奇数位(二种方法)

1
2
3
4
5
li1 = [11,22,33,44,55]
li1 = li1[1::2]
print(li1)
 
$[22, 44]li1 = [11,22,33,44,55]<br>for i in range(len(li1)-1,-1,-2) :<br>    del li1[i]<br>print(li1)$[22, 44]<br><br>

分析题:

1
2
3
4
5
6
7
8
9
10
11
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]
$第四次进入循环列表元素改变,不会再次循环<br><br>这样可以解决问题for i in range(len(lis)) :<br>   lis.pop()<br>print(lis)

dict的特殊情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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', '二', '哥']}

字典的删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#循环删除字典中键中包含'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的情况

1
2
3
print(bool(0),bool(''),bool([]),bool(()),bool({}),bool(set()))
 
$False False False False False False

集合

可变的数据类型,集合元素必须是不可变数据类型,无序,集合自动去重复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
基本操作:
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)

比较方法:

1
2
3
4
5
6
7
8
9
10
11
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

集合方法:

1
集合本身是可变数据类型,可以使用frozense()将集合冻住

深浅拷贝  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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])

1
2
3
4
5
6
li = ['a','b','c','d']
for index,value in enumerate(li) :
            print(index,value)
#数字列可以设置开头列
for index,value in enumerate(li,100) :
            print(index,value)

  

posted @   wsg-python  阅读(162)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示