今天继续看effective python第5章
# 切片可以在list,str,bytes上进行切割,用法是 somelist[start:end] 其中start(起始索引)所指的元素涵盖在切割范围中,而end(结束索引)所指的元素不在切割范围中。
a = ['a', 'b','c', 'd', 'e', 'f', 'g', 'h']
print('First four:', a[:4])
print('Last four:', a[-4:])
print('Middle two:', a[3:-3])
# 如果从列表开头获取切片,那就不要在start那里写上0,而是应该把它留空,如果一直取到末尾,就应该把end留空。
assert a[:5] == a[0:5]
assert a[5:] == a[5:len(a)]
# 如果要从列表尾部向前算,可以使用负值来表示相关偏移量
print(a[:])
print(a[-3:-1])
print(a[1:-1])
# 切割列表时,即便start和end索引越界也不会出问题。利用这一点,可以限定输入序列的最大长度。
first_twenty_items = a[:20]
last_twenty_items = a[-20:]
# 但是在访问列表中的单个元素时,下标不能越界。
#print(a[20]) # 这个会报错
# 可以通过对切片附值的形式来更新列表
print('before', a)
a[2:7] = [99, 22, 16]
print('after', a)
# 上面的代码把2,3,4,5,6 号元素赋值为 99,22,16 ,自动的从5个元素变成了3个元素。
# 特殊的,如果有a[:]=[99,22,16] 那么会把a的所有元素替换成99,22,16,系统不会新建列表
# 如果把切片的索引都留空,那么可以产生一份原列表的拷贝
b = a[:]
assert b == a and b is not a
要点:
- 不要写多余的代码:当start索引为0,或end索引为序列长度时,应该将其省略。
- 切片操作不会计较start与end索引是否越界,这使得我们很容易就能从序列的前端或后端开始,对其进行范围固定的切片操作(如a[:20]或a[-20:])
- 对list赋值的时候,如果使用切片操作,就会把原列表中处在相关范围内的值替换成新值,即便它们的长度不同也依然可以替换。