为什么这个str严格的比较在Python中失败了?

时间:2014-04-10 11:03:04

标签: python string comparison

我在装饰器中有这个代码:

is_local_valid = ['system_id', 'server_id', 'sensor_id']
local_params = [x for x in is_local_valid if x in kwargs.keys() and kwargs[x].lower() is 'local'] + [y for y in args if y.lower() is 'local']
if local_params == []:
    raise AssertionError("Tried to access the database from a non connected profile")

我注意到,用于比较两个字符串的is中缀运算符在这种情况下返回False,即使kwargs[x].lower()等于local也是如此。但==运算符确实返回True。当然,两者都是str

有关进展情况的任何线索?

2 个答案:

答案 0 :(得分:3)

  

操作员是和不测试对象身份:
  当且仅当x和y是同一个对象时,x才是真的。 x不是y产生反向真值。

>>> id('local')
42745112
>>> a = {1: 'locAl'}
>>> id(a[1].lower())
53363408

它们不是同一个对象

答案 1 :(得分:0)

a is b确定两个名称ab 是否引用同一个对象(即id(a) == id(b))。 a == b确定他们是否具有相等的值。将字符串与is进行比较并不是一个好主意。改为使用==

>>> "".join("hello")
'hello'
>>> "hello" is "".join("hello")
False
>>> "hello" == "".join("hello")
True

is进行比较的唯一一般情况是None,例如:

if a is None: