为啥 Python 将单字符字符串视为相同? [复制]
Posted
技术标签:
【中文标题】为啥 Python 将单字符字符串视为相同? [复制]【英文标题】:Why does Python count single-char strings as identical? [duplicate]为什么 Python 将单字符字符串视为相同? [复制] 【发布时间】:2013-10-21 11:50:06 【问题描述】:那么,让我们来看看我们所知道的:
is
运算符比较身份,而不是值,与 ==
运算符相反。
Python 实习生字符串文字,所以"hello" is "hello"
是True
。
所以我不明白的是这种行为:
>>>'h' is input()
h
True
>>>'hj' is input()
hj
False
单个字符被认为是相同的,即使它们不是两个字符串文字,而双字符字符串给我的结果是我期望的不同。
由于 input() 函数是动态创建字符串的,因此结果不会被实习,这就是为什么 'hj'
和动态创建的 'hj'
不相同的原因。但是为什么'h'
和动态'h'
相同呢?
这是否意味着 Python 缓存/实习所有长度为 1 的字符串?
【问题讨论】:
@Aerovistae:你能解释一下为什么不吗? 另一个答案没有深入探讨为什么单个字符串在所有情况下都是相同的,即使是在动态创建时也是如此,这就是这里的问题。另一个答案解释了字符串身份测试的一般工作原理。 答案是“因为 cpython 开发人员觉得它很方便(而且成本不会太高)”。它是实现定义的行为,你不应该依赖它,因为它在另一个解释器甚至不同版本的 cpython 中可能会以不同的方式工作。您永远不应依赖来自不同来源的具有相同id
的任何字符串。
【参考方案1】:
identical
与 equal
不同。 identical
表示它们具有相同的内存地址(当然,除了废话 __eq__
或 __cmp__
它们也必须相等)
Python 语言没有指定字符串何时应该或不应该占用相同的内存地址。由于字符串是不可变的,因此实现可以选择“实习”它们作为优化
以pypy为例
Python 2.7.2 (1.9+dfsg-1, Jun 19 2012, 23:23:45)
[PyPy 1.9.0 with GCC 4.7.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``<fijal> I love pypy''
>>>> 'h' is raw_input()
h
False
【讨论】:
我知道...我在问为什么h
和动态创建的h
相同,但hj
和动态创建的hj
不同。
虽然id(x) == id(y)
不必暗示x == y
,给定一个适当荒谬的__eq__
@Eric,试试 "x = float("NaN"); y=x"。那么 x 和 y(显然)具有相同的 id()
,但 x == y
是 False
。归咎于 IEEE 754 ;-)【参考方案2】:
From the source code:
PyObject *
PyString_FromStringAndSize(const char *str, Py_ssize_t size)
// ...
if (size == 1 && str != NULL &&
(op = characters[*str & UCHAR_MAX]) != NULL)
Py_INCREF(op);
return (PyObject *)op;
// ...
CPython 在characters
数组中实习所有单个字符串。
【讨论】:
优秀。这正是我希望看到的。以上是关于为啥 Python 将单字符字符串视为相同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章