列表 list
首先看一段代码:
def list_head1(l):
print(l[0])
def list_head2(l):
print(l[:1])
print(l)
if __name__ == '__main__':
L = [1, 2, 3, 4, 5]
list_head1(L)
list_head2(L)
我们得到结果是:
由此可见 [0] 得到的就是列表 list 的第一个元素,这里也就是一个整型变量,而 [:1] 使用切片得到的是一个新的 list 变量。
我一开始错误的以为 [:1] 得到的也是第一个元素,其实不是,新得到的是一个 list 变量。
为什么想到验证这个问题呢:是在由于空 list 的情况差异导致的。请看代码:
def list_head1(l):
print(l[0])
def list_head2(l):
print(l[:1])
print(l)
if __name__ == '__main__':
L = []
list_head1(L)
这样运行,代码报错:
但是第二种运行:
def list_head1(l):
print(l[0])
def list_head2(l):
print(l[:1])
print(l)
if __name__ == '__main__':
L = []
list_head2(L)
运行正确,结果如下:
字符串 str
同样的我们测试字符串类型 str:
def list_head1(s):
print(s[0])
def list_head2(s):
print(s[:1])
print(s)
if __name__ == '__main__':
S = 'Abc'
list_head1(S)
list_head2(S)
运行结果如下:
这种情况下两者行为一致,都是返回第一个字符。
但是如果是空字符呢?
def list_head1(s):
print(s[0])
def list_head2(s):
print(s[:1])
print(s)
if __name__ == '__main__':
S = ''
list_head1(S)
第一个函数会报错:
而第二个函数:
def list_head1(s):
print(s[0])
def list_head2(s):
print(s[:1])
print(s)
if __name__ == '__main__':
S = ''
list_head2(S)
代码正常运行,结果如下:
我们发现没有任何输出,那么切片得到的是什么呢?
我们检查一下类型
def list_head1(s):
print(s[0])
def list_head2(s):
print(isinstance(s[:1], str))
print(s)
if __name__ == '__main__':
S = ''
list_head2(S)
结果如下:
我们切出来的是一个空字符串。
总结:
- [0],意思是取第一个元素,得到的是列表/字符串的第一个元素;如果列表/字符串是空的,取第一个元素就会下标越界
- [:1],意思是进行切片,意思是取从0开始到1为止的这些数据,得到的是列表/字符串/元组;当第一个元素不存在时,返回空列表/空字符串/空元组。