关于ZAKER 融媒体解决方案 合作 加入

python – “是”运算符不按预期工作

CocoaChina 10-21

看看这段代码吧:

import reti = "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"

输出:

4169697641696976<_sre.SRE_Match object at 0x00000000027C3ED0><_sre.SRE_Match object at 0x00000000027C3ED0>not matching

定义是:

`is` is identity testing, == is equality testing. is will return True if two variables point to the same object

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

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

最佳答案

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

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

Return the "identity" of an object. This is an integer ( or long integer ) which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id ( ) value.

在您的代码中 , 您实际上没有一个对象 , 您有两个具有非重叠生命周期的单独对象 .

如果要确保不重用 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_searchFalse

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

以上内容由"CocoaChina"上传发布 查看原文
相关标签 正则

觉得文章不错,微信扫描分享好友

扫码分享