Wiz*_*ard 7 python variables conditional-operator
可能重复:
Python"is"运算符使用整数意外运行
昨晚做了什么奇怪的事情
if max_urls is 0:
max_urls = 10
Run Code Online (Sandbox Code Playgroud)
总是会返回false ...即使max_urls为0 ....它也是从数据库中分配的.当我做了一个
print type(max_urls)
Run Code Online (Sandbox Code Playgroud)
会回来的
<type 'long'> 0
Run Code Online (Sandbox Code Playgroud)
这似乎是正确的,但它总是会返回虚假.
如果我把它改成了
if max_urls == 0:
max_urls = 10
Run Code Online (Sandbox Code Playgroud)
那么当它为0时它最终会返回true.为什么==和之间的区别是?
And*_*ark 23
==是一个值比较,is是一个对象标识(memory location)的比较.您经常会看到比较之类max_urls is 0的结果将给出预期的结果,因为小值通常在Python中缓存,但您总是希望使用==而不是is在检查相等性时,因为不能依赖此行为.
这是一个简短的例子说明了这一点:
>>> a = 0
>>> (a == 0, a is 0)
(True, True)
>>> a = 1000
>>> (a == 1000, a is 1000)
(True, False)
Run Code Online (Sandbox Code Playgroud)
该is运营商将检查两个引用指向同一个对象.您正在测试是否long(0)与对象相同int(0),答案是否定的.如果您打印它们的对象ID,这将是非常清楚的:
>>> max_urls = long(0)
>>> id(max_urls)
335952
>>> id(0)
8402324
Run Code Online (Sandbox Code Playgroud)
==另一方面,检查两个值是否相等,即使它们不是完全相同的对象.例如:
>>> a = 777
>>> b = 777
>>> a is b
False
>>> a == b
True
>>> id(a)
8404568
>>> id(b)
8404640
Run Code Online (Sandbox Code Playgroud)
注意:重要的是我使用777而不是像1或2这样的较小数字.引用Python手册:
当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用.
| 归档时间: |
|
| 查看次数: |
44365 次 |
| 最近记录: |