看看这段代码吧:
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.是比较对象使用时的预期行为==.
您从未分配返回值,因此在打印调用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无法重用内存位置.