它仍然可以使用"是"比较两个字符串并在python中得到真实?

时间:2017-05-16 09:55:59

标签: python

我想知道是否仍然可以使用"是"比较两个字符串并获得真实? 就像我们添加一些使

的函数或表达式
F(("a" * 100)) is ("a" * 100)

是真的吗?

由于

2 个答案:

答案 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,请始终始终使用==