【发布时间】:2015-10-24 10:02:58
【问题描述】:
我是 Python 新手。你能帮我解释一下吗:
>>> list2 = [1, 2, 3]
>>> print(list2[1:-1])
[2]
>>> print(str(list2)[1:-1])
1, 2, 3
为什么列表改成字符串切片结果不一样?
【问题讨论】:
-
你看过没有切片的字符串吗?
标签: python string list python-3.x slice
我是 Python 新手。你能帮我解释一下吗:
>>> list2 = [1, 2, 3]
>>> print(list2[1:-1])
[2]
>>> print(str(list2)[1:-1])
1, 2, 3
为什么列表改成字符串切片结果不一样?
【问题讨论】:
标签: python string list python-3.x slice
切片适用于您正在切片的序列中的各个元素,返回一个与您切片的类型相同且包含所选元素的新对象。
您的列表包含整数,切片会生成一个包含所选整数的新列表。字符串包含字符,因此对字符串进行切片会生成一个包含所选字符的新字符串。
您的列表仅包含 3 个元素(整数 1、2 和 3),您的字符串包含更多元素,即字符 '['、'1'、' '(一个空格)、','(逗号)、'2'、' '、','等,一直到最后的']'。请注意,这些元素不是整数,, 字符没有特殊含义,空格也算作字符。该字符串共包含 9 个字符。
因此,当您对列表进行切片删除第一个和最后一个元素时,只剩下一个元素,即整数 2。但是对字符串进行切片会删除'['(第一个字符)和']',留下剩余的字符串'1, 2, 3',总共7个字符。
如果您让解释器回显这些对象(而不是使用print()),它可能会更清楚:
>>> list2 = [1, 2, 3]
>>> list2
[1, 2, 3]
>>> len(list2)
3
>>> str(list2)
'[1, 2, 3]'
>>> len(str(list2))
9
>>> list2[1:-1]
[2]
>>> len(list2[1:-1])
1
>>> str(list2)[1:-1]
'1, 2, 3'
>>> len(str(list2)[1:-1])
7
注意字符串对象周围的' 引号。
【讨论】:
字符串也是可以切片的可迭代对象:
>>> "abcde"[1:-1]
'bcd'
而列表的字符串表示就是列表的元素,用逗号分隔,用括号括起来:
>>> str(list2)
'[1, 2, 3]'
因此,当您删除†可迭代字符串"[1, 2, 3]" 中的第一个和最后一个条目时,您会得到字符串"1, 2, 3"(不是,因为它会出现在您print 它时,列表):
>>> str(list2)[1:-1]
'1, 2, 3'
†请记住,在 Python 中,您可以使用负索引从可迭代对象中的 last 条目到第一个条目,因此 [1:-1] 相当于[1:len(iterable) - 1]。也就是从second到倒数第二个的每一个元素。
【讨论】:
[1:-1] 表示从第一个元素切片到倒数第二个元素。直接切片list2时,会去掉第一个和最后一个元素(1和3),只剩下中间元素[2]。
在python中,字符串也被认为是可迭代的;每个字符都可以被认为是一个元素。 list2 的字符串形式为'[1, 2, 3]'。因此,当您删除第一个和最后一个字符(左右括号)时,您会得到子字符串'1, 2, 3'。
【讨论】: