为什么字符串比较和标识在pdb和python控制台

时间:2018-02-27 12:30:50

标签: python pdb

我在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 console:

>>> 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.为什么运营商(如'=='和'是')在两个控制台中表现不同。

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

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

但是

中的4431713024
id(u'\u4f60\u597d')

3.为什么在python3中没有出现这种情况

1 个答案:

答案 0 :(得分:1)

让我们从is检查开始,因为这稍微容易回答。

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

检查同一行中的id时,情况会有所不同,因为两个字符串同时存在。这里解释器和调试器的行为不同。解释器实例化字符串,因此它们是相同的对象,因此具有相同的id,而调试器则没有。u'你好' == u'\u4f60\u597d'。 (有关实习的详情,请参阅Python string interning @DeepSpace建议的in the comments

我认为在第一次测试中(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]

虽然翻译没有:

 <div class="modal fade" tabindex="-1" role="dialog" id="mySignup">
            <div class="modal-dialog" role="document">
                <div class="login-wrap">
                    <div class="form text-center">
                        <input type="text"  id="name"/>
                        <input type="email"  id="email"/>
                        <input type="password"  id="password"/>
                        <button id="SignUp" data-dismiss="modal" 
                      >Signup</button>
                    </div>
                </div>
                {{csrf_field()}}
            </div>
  </div>
     $(document).ready(function () {

        $('#SignUp').click(function (event) {
            var name = $('#name').val();
            var email = $('#email').val();
            var password =$('#password').val();
            $.post('/register',{
                    'name' : name,
                    'email' :email,
                    'password':password,
                    '_token':$('input[name=_token]').val()

                },
                function (data) {
                    $('#body').load(location.href + '#body')
                });
            console.log(password)
        });
  });

至于为什么不这样,这个问题需要由其他人来回答。