我已经阅读了一段这样的代码:
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是不同的。所以他们因某种原因不同。
答案 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
对象a
和b
是同一个对象,但他们的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