Python拆包
拆包
拆包就是将一个对象拆为多个对象,拆包实际上可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。除非我们用 * 来表示忽略多余的元素。带*的变量返回列表。
列表拆包拆包:*在最后
my_list = [1,2,3,4,5,6,7]
a,b,c,*d = my_list
print(id(my_list))
print(a,id(a))
print(b,id(b))
print(c,id(c))
print(d,id(d))
2501524670664
1 140717351068304
2 140717351068336
3 140717351068368
[4, 5, 6, 7] 2501524152456
可以看到,使用拆包将列表分为几个对象
*在中间
my_list = [1,2,3,4,5,6,7]
a,b,*c,d = my_list
print(id(my_list))
print(a,id(a))
print(b,id(b))
print(c,id(c))
print(d,id(d))
2501525132232
1 140717351068304
2 140717351068336
[3, 4, 5, 6] 2501524050504
7 140717351068496
*在开头
my_list = [1,2,3,4,5,6,7]
*a,b,c,d = my_list
print(id(my_list))
print(a,id(a))
print(b,id(b))
print(c,id(c))
print(d,id(d))
2501525134024
[1, 2, 3, 4] 2501524247688
5 140717351068432
6 140717351068464
7 140717351068496
可以看到当列表个数大于拆包所用的变量个数时,带*号的会多匹配。打个比方,my_list就是一堆萝卜,而使用的变量就是萝卜坑,那么萝卜坑就有了大小,不带 * 的萝卜坑比较小,只能容纳一个萝卜,也就是一个元素,而带 * 的罗比坑比较大,能够容纳所有放置在不带 * 的萝卜坑之外的萝卜。
元组拆包
my_tuple = (1,2,3,4,5,6,7)
*a,b,c,d = my_tuple
print(id(my_tuple))
print(a,id(a))
print(b,id(b))
print(c,id(c))
print(d,id(d))
2501523511192
[1, 2, 3, 4] 2501524669704
5 140717351068432
6 140717351068464
7 140717351068496
字典拆包
my_dict = {'a' : 1,'b' : 2,'c' : 3,'d' : 4,'e' : 5 }
a,*b = my_dict
print(id(my_dict))
print(a,id(a))
print(b,id(b))
2501526471880
a 2501447465032
['b', 'c', 'd', 'e'] 2501524137672
字符串拆包
my_str = 'abcdefghi'
a,b,*c = my_str
print(id(my_str))
print(a,id(a))
print(b,id(b))
print(c,id(c))
2501523531504
a 2501447465032
b 2501476061792
['c', 'd', 'e', 'f', 'g', 'h', 'i'] 2501524155208