元组
元组是一种固定长度、不可变的python对象序列。
创建元组最简单的办法就是用逗号分隔序列值
a = 1, 2, 3, 5
print(a) # (1, 2, 3, 5)
元组一旦创建,各个位置上的对象是无法被修改的
但是,如果元组中的一个对象是可变的,则可以修改这个可变变量
tup = tuple(['foo', [1, 2], True]) # 显式转换类型
#tup[2] = False # 报错:TypeError: 'tuple' object does not support item assignment
tup[1].append(3) #[1, 2]是可变对象
print(tup) # ('foo', [1, 2, 3], True)
.
乘拷贝
乘拷贝其实是我自己创造出来的词,用来表示以下情况:
a = [0]*3
print(a) # [0, 0, 0]
print(id(a[0])) # 140736869736816
print(id(a[1])) # 140736869736816
print(id(a[2])) # 140736869736816
看到前两行,你可能会觉得奇怪。不就是一个普通的生成列表嘛,有什么好讨论的?
但请你仔细看后三行,发现了什么?列表a中三个元素的对象地址一模一样。
也就是说,对象[0]并没有进行复制,只是指向他的引用进行了复制,a中的三个元素其实只是一个对象[0]的三个引用。
可能你还没有感到什么奇怪的地方,那么再举一个例子:
a = [[0]]*3
a[1].append(3)
print(a) # [[0, 3], [0, 3], [0, 3]]
奇怪的事情发生了!(呆猫
我明明修改的是a[1],为什么整个a都被修改了?
正如上文所说,这就是乘拷贝带来的恶果。这种情况下,a[1],a[2],a[3]只是一个对象的三个不同引用而已。因此,修改了一个,另外两个也会变化
.
高级拆包
高级拆包用于在函数调用时获取任意长度的位置参数列表
举个栗子
values = 1, 2, 3, 4, 5
a, b, *_ = values
print(a, b) # 1 2
print(_) # [3, 4, 5]
该功能使用了特殊的语法*_(其中_就是一个变量名,你可以取任何你想要的名字),值得注意的是,无论原对象是元组,列表,还是字符串等,_返回的都是一个列表
.
参考资料
《利用python进行数据分析》