为什么字符串比较和标识在pdb和python中的行为不同

2024-09-27 01:22:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python控制台和pdb中运行相同的python代码片段,但得到的结果不同,如下所示:

pdb公司:

>>> import pdb
>>> pdb.set_trace()
(Pdb) print u'你好' == u'\u4f60\u597d'
False
(Pdb) print u'你好' is u'\u4f60\u597d'
False
(Pdb) print id(u'你好'), id(u'\u4f60\u597d')
4431713024 4431713120
(Pdb) id(u'你好')
4431713024
(Pdb) id(u'\u4f60\u597d')
4431713024

python控制台:

>>> print u'你好' == u'\u4f60\u597d'
True
>>> print u'你好' is u'\u4f60\u597d'
True
>>> print id(u'你好'), id(u'\u4f60\u597d')
4376711984 4376711984
>>> id(u'你好')
4376711984
>>> id(u'\u4f60\u597d')
4376711984

我的python版本是2.7.13

所以我的问题是:

1.为什么运算符(如“==”和“is”)在两个控制台中执行不同的操作。你知道吗

2.在pdb中,id(u'\u4f60\u597d')等于4431713120英寸

print id(u'你好'), id(u'\u4f60\u597d')

但4431713024在

id(u'\u4f60\u597d')

3.为什么这种情况不会发生在Python身上3


Tags: 代码import版本idfalsetrueistrace
1条回答
网友
1楼 · 发布于 2024-09-27 01:22:35

让我们从is检查开始,因为这更容易回答。你知道吗

请注意,当您检查两行中的id时,解释器和调试器对这两个字符串都显示相同的id。这是因为第一个字符串是在某个地址初始化的,您可以打印它的id。然后创建一个新字符串,并使用相同的变量名,这样就没有指向第一个字符串的引用了。这意味着第一个字符串被垃圾收集,其内存被释放。新创建的字符串占用了第一个可用的内存空间,而这个内存空间恰好是刚刚变为可用的。因此,它的id与第一个字符串的^{(当它还活着时)相同。你知道吗

当检查同一行中的id时,情况不同,因为两个字符串同时存在。在这里,解释器和调试器的行为不同。解释器实习生字符串,因此它们是相同的对象,因此具有相同的id,而调试器没有。(参考Python string interning,正如@DeepSpacein the comments所推荐的,了解更多关于实习的信息)。你知道吗

我认为根本原因实际上可以在第一个测试中看到,u'你好' == u'\u4f60\u597d'。这两个字符串在解释器和调试器中的表示方式不同,因此它不能将它们内部化(因为调试器认为它们是两个不同的字符串)。你知道吗

调试器为两个字符串指定不同的代码点:

(Pdb) map(ord, u'你好')
[228, 189, 160, 229, 165, 189]
(Pdb) map(ord, u'\u4f60\u597d')
[20320, 22909]

而口译员没有:

>>> map(ord, u'你好')
[20320, 22909]
>>> map(ord, u'\u4f60\u597d')
[20320, 22909]

至于为什么不行,这个问题需要别人来回答。你知道吗

相关问题 更多 >

    热门问题