我在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')
但是
中的4431713024id(u'\u4f60\u597d')
3.为什么在python3中没有出现这种情况
答案 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)
});
});
至于为什么不这样,这个问题需要由其他人来回答。