"是"运营商没有按预期工作

vks*_*vks 2 python

看看这段代码吧:

import re

ti = "abcd"
tq = "abcdef"
check_abcd = re.compile('^abcd')
print id(check_abcd.search(ti))
print id(check_abcd.search(tq))
print check_abcd.search(ti)
print check_abcd.search(tq)
if check_abcd.search(ti) is check_abcd.search(tq):
    print "Matching"
else:
    print "not matching"
Run Code Online (Sandbox Code Playgroud)

输出:

41696976
41696976
<_sre.SRE_Match object at 0x00000000027C3ED0>
<_sre.SRE_Match object at 0x00000000027C3ED0>
not matching
Run Code Online (Sandbox Code Playgroud)

定义is:

`is` is identity testing, == is equality testing. 
 is will return True if two variables point to the same object
Run Code Online (Sandbox Code Playgroud)

1)现在为什么当id和对象引用相同时is不返回True.

2)当is被替换时==它仍然返回false.是比较对象使用时的预期行为==.

Mar*_*ers 6

您从未分配返回值,因此在打印调用id()返回值的值后check_abcd.search(),Python 会丢弃返回值对象,因为不再引用它.CPython对象的生命周期直接由对它们的引用数量决定; 只要该引用计数降为0,该对象就会从内存中删除.

丢弃的内存位置可以重复使用,因此您希望在id()调用中看到相同的值.查看id()文档:

返回对象的"标识".这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的.具有非重叠寿命的两个对象可以具有相同的id()值.

在代码中没有任何一个实际上你有一个对象,你有两个单独的对象,它们的生命周期不重叠.

如果要确保id()不重用值,请指定返回值:

>>> import re
>>> ti = "abcd"
>>> tq = "abcdef"
>>> check_abcd = re.compile('^abcd')
>>> ti_search = check_abcd.search(ti)
>>> tq_search = check_abcd.search(tq)
>>> id(ti_search), id(tq_search)
(4378421952, 4378422056)
>>> ti_search, tq_search
(<_sre.SRE_Match object at 0x104f96ac0>, <_sre.SRE_Match object at 0x104f96b28>)
>>> ti_search is tq_search
False
Run Code Online (Sandbox Code Playgroud)

通过分配check_abcd.search()(正则表达式MatchObjects)的返回值,将创建另一个引用,并且Python无法重用内存位置.

  • @vks:因为*不是同一个对象*.`is`不测试内存位置.它测试某些东西是否实际上是完全相同的对象. (3认同)