【发布时间】:2019-01-24 23:46:25
【问题描述】:
在 Python 中,为什么 [:] 切片操作的行为不一致?
它对列表和字符串的行为不同。
对于列表,它给出一个副本列表对象,对于字符串,它给出相同的字符串对象。
我觉得这令人困惑,违反直觉。有什么方法可以解释/证明这一点?
>>> s = "1234"
>>> s is (s[:2] + s[2:])
False
>>> s is s[:]
True
>>> lst = [1,2,3,4]
>>> lst is lst[:]
False
>>> lst is (lst[:2] + lst[2:])
False
我觉得这部分令人困惑。我希望这会返回False。
>>> s is s[:]
True
另外,我希望这两个返回相同的结果False,但事实并非如此。
>>> s is (s[:2] + s[2:])
False
>>> s is s[:]
True
有什么想法吗?
【问题讨论】:
-
基本上,
interned在 Python 中是无法保证的。这意味着您不能期望相同的字符串指向同一个对象。 -
@Sraw 我问的正好相反。
-
如果您的程序曾经关心不可变对象的身份,那么您可能做错了什么。对象标识对于可变对象很重要,但各种对象重用优化对于不可变对象都是安全的。
-
@user2357112 我明白了,但是......好吧,行为似乎仍然不一致。为什么
s is s[:]返回True。我觉得这很奇怪,就我一个人吗? -
@peter.petrov 这是一个实现细节,毫无疑问,
str对象的“整个切片”被优化为简单地返回str对象本身。为什么这很重要?
标签: python python-3.x slice