Python列表切片[-1:]和[-1]之间有什么区别吗?

时间:2015-11-21 07:52:49

标签: python list

我已经阅读了一段这样的代码:

s = self.buffer_file.readline()
if s[-1:] == "\n":
    return s

如果我这样做:

s = 'abc'
In [78]: id(s[-1:]), id(s[-1])
Out[78]: (140419827715248, 140419827715248)

In [79]: id(s[-1:]) is id(s[-1])
Out[79]: False

In [80]: id(s[-1:]) == id(s[-1])
Out[80]: True

对我来说没有意义,ID号是相同的,但ID是不同的。所以他们因某种原因不同。

3 个答案:

答案 0 :(得分:8)

不同之处在于切片列表的结果是列表

x = [1, 2, 3]

print(x[-1])  # --> 3
print(x[-1:]) # --> [3]

第二种情况恰好是一个元素的列表,但它仍然是一个列表。

但请注意,Python没有char类型与str类型不同,这意味着str对象上的元素访问和切片都返回另一个{{1} object:

str

使用例如print("abcd"[-1]) # --> "d" print("abcd"[-1:]) # --> "d" s[-1:]而不是s[:1]s[-1]的唯一优势是切片表达式在执行时不会引发运行时错误在一个空字符串(元素访问的东西)...这可能允许代码简化:

s[0]

答案 1 :(得分:7)

s[-1:]而不是s[-1]的关键实际好处是,前者将产生一个空的迭代,而不是用回溯停止。

>>> 'hi'[-1:]
'i'
>>> 'hi'[-1]
'i'
>>> ''[-1:]
''
>>> ''[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

这允许if s[-1:] == "\n":处理空行s而不用if s:前面的行,只需评估False而不是生成需要处理的错误try..except结构。

答案 2 :(得分:5)

id(s[-1:]) is id(s[-1])表示id本身​​(整数)引用相等。假设CPython 2。

这个问题可能是指定的实施。

注意小整数池。 http://davejingtian.org/2014/12/11/python-internals-integer-object-pool-pyintobject/

这可能有所帮助:

Python 2.7.10 (default, Sep 23 2015, 04:34:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)] on darwin

>>> s = 'abc'
>>> s[-1:]
'c'
>>> s[-1]
'c'
>>> s[-1:]
'c'
>>> a = s[-1:]
>>> b = s[-1]
>>> id(a)
4531751912
>>> id(b)
4531751912
>>> a is b
True
>>> id(a) is id(b)
False

对象ab是同一个对象,但他们的id是两个ints,不是“参考相等”。

有关整数的更多信息:

>>> 5 is 100
False
>>> 5 is 5
True
>>> 10000 is 10000
True
>>> 1000000000 is 1000000000
True
>>> a = 10000000
>>> a is 10000000
False
>>> a, b = 100000000, 100000000
>>> a is b
True
>>> a is 100000000
False
>>> id(100000000)
140715808080880
>>> id(a)
140715808080664
>>> id(b)
140715808080664
>>> id(100000000)
140715808080640
>>>

进一步阅读: PyPy实现的详细信息:http://doc.pypy.org/en/latest/cpython_differences.html#object-identity-of-primitive-values-is-and-id