我在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
让我们从
is
检查开始,因为这更容易回答。你知道吗请注意,当您检查两行中的
id
时,解释器和调试器对这两个字符串都显示相同的id
。这是因为第一个字符串是在某个地址初始化的,您可以打印它的id
。然后创建一个新字符串,并使用相同的变量名,这样就没有指向第一个字符串的引用了。这意味着第一个字符串被垃圾收集,其内存被释放。新创建的字符串占用了第一个可用的内存空间,而这个内存空间恰好是刚刚变为可用的。因此,它的id
与第一个字符串的^{(当它还活着时)相同。你知道吗当检查同一行中的
id
时,情况不同,因为两个字符串同时存在。在这里,解释器和调试器的行为不同。解释器实习生字符串,因此它们是相同的对象,因此具有相同的id
,而调试器没有。(参考Python string interning,正如@DeepSpacein the comments所推荐的,了解更多关于实习的信息)。你知道吗我认为根本原因实际上可以在第一个测试中看到,
u'你好' == u'\u4f60\u597d'
。这两个字符串在解释器和调试器中的表示方式不同,因此它不能将它们内部化(因为调试器认为它们是两个不同的字符串)。你知道吗调试器为两个字符串指定不同的代码点:
而口译员没有:
至于为什么不行,这个问题需要别人来回答。你知道吗
相关问题 更多 >
编程相关推荐