小编P. *_*tiz的帖子

字符串字符标识悖论

我完全坚持这个

>>> s = chr(8263)
>>> x = s[0]
>>> x is s[0]
False
Run Code Online (Sandbox Code Playgroud)

这怎么可能?这是否意味着通过索引访问字符串字符会创建相同字符的新实例?我们来试验:

>>> L = [s[0] for _ in range(1000)]
>>> len(set(L))
1
>>> ids = map(id, L)
>>> len(set(ids))
1000
>>>
Run Code Online (Sandbox Code Playgroud)

哎呀浪费字节;)或者它是否意味着str.__getitem__有一个隐藏的功能?有人可以解释一下吗?

但这并不是我的惊喜:

>>> s = chr(8263)
>>> t = s
>>> print(t is s, id(t) == id(s))
True True
Run Code Online (Sandbox Code Playgroud)

这很清楚:t是别名s,所以它们代表相同的对象和身份重合.但同样,以下是可能的:

>>> print(t[0] is s[0])
False
Run Code Online (Sandbox Code Playgroud)

s并且t是同一个对象那又怎样?

但更糟糕的是

>>> print(id(t[0]) == id(s[0]))
True
Run Code Online (Sandbox Code Playgroud)

t[0]并且s[0]没有被垃圾收集,被 …

python string python-internals

11
推荐指数
1
解决办法
413
查看次数

标签 统计

python ×1

python-internals ×1

string ×1