我想知道是否仍然可以使用"是"比较两个字符串并获得真实? 就像我们添加一些使
的函数或表达式F(("a" * 100)) is ("a" * 100)
是真的吗?
由于
答案 0 :(得分:0)
is
关键字测试两个实例是否相同。这是一个比平等更严格的要求。换句话说,两个字符串可以相等,但仍然不相同。因此,请改用==
。
答案 1 :(得分:0)
是的,但不是一个好主意。
is
比较对象的标识(my_friend is dave
),而==
则比较值(my_friend.name == 'dave'
) 。对于某些数据类型,它们可以互换使用,但我不推荐它
要了解使用is
时发生的情况,您可以使用id()
方法
>>> foo = 'test'
>>> bar = 'test'
>>> id(foo)
4301978624
>>> id(bar)
4301978624
>>> foo is bar
True
如您所见,Python为不同的对象返回相同的ID。当对象共享相同的引用时,这意味着它们在引擎盖下是相同的对象,因此foo is bar
为True。在我们的两个字符串的情况下,这种行为只是因为Python正在为内存和性能原因进行内部优化,将一个字符串副本存储在内存中并将两个对象引用指向同一个内存。
一个很好且众所周知的例子是所有数字< = 256.Python存储所有这些数字的单个副本,所以当你指定一个数字< = 256时,你只需要获得对这些数字之一的新引用“全球“副本:
>>> foo = 42
>>> bar = 42
>>> id(foo)
4298358768
>>> id(bar)
4298358768
>>> foo is bar
True
一旦你得到数字> 256,Python不再执行此优化,上述行为消失了:
>>> foo = 123456789
>>> bar = 123456789
>>> id(foo)
4300144208
>>> id(bar)
4301664016
>>> foo is bar
False
当您想要确认特定对象的身份时,您应该只使用is
,即您获得的对象正是您期望的对象。如果你只是用它来比较值,你会遇到奇怪和意想不到的行为,因为一些字符串比较和小整数比较将按预期工作,但其他人肯定不会。如果您没有特定的理由使用is
,请始终始终使用==