看看这段代码:
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"
Output:
41696976
41696976
<_sre.SRE_Match object at 0x00000000027C3ED0>
<_sre.SRE_Match object at 0x00000000027C3ED0>
not matching
的定义is
:
`is` is identity testing, == is equality testing.
is will return True if two variables point to the same object
1)现在为什么是is
不回来True
当 id 和对象引用相同时。
2)When is
被替换为==
它仍在返回false
.这是使用比较对象时的预期行为==
.
您从未分配返回值,因此在打印后id()
返回值的值check_abcd.search()
调用、Pythondiscards返回值对象,因为没有任何东西再引用它。 CPython 对象的生命周期直接由对其引用的数量控制;一旦引用计数降至 0,该对象就会从内存中删除。
废弃的内存位置可以重新使用,因此您会希望看到相同的值出现在id()
来电。请参阅id()文档:
返回对象的“身份”。这是一个整数(或长整数),保证该对象在其生命周期内是唯一且恒定的。具有不重叠生命周期的两个对象可能具有相同的生命周期id()
value.
在你的代码中,你实际上没有任何地方one对象,您有两个生命周期不重叠的独立对象。
如果您想确保指定返回值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
通过分配返回值check_abcd.search()
(正则表达式MatchObject
s) 创建了一个额外的引用,Python 无法重用该内存位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)