【问题标题】:'in' keyword in python - identity or equality? [duplicate]python中的'in'关键字-身份还是相等? [复制]
【发布时间】:2021-11-07 09:31:55
【问题描述】:

我知道is 在 python 中测试身份而不是对象(例如字符串)的相等性。但是我很好奇in 在用于检查项目是否在列表/字典中时是否检查相等或身份?

我无法可靠地对此进行测试,因为我的解释器似乎可以随意自动使用 interning 字符串(正如您在下面看到的,即使 is 测试通过也意味着在内存中只为所有人创建了一个字符串副本delta) 的表示:

>>> l = ['a', 'b', 'delta']
>>> if 'delta' in l:
...   print('K')
... 
K
>>> if l[2] is 'delta':
...   print('K')
... 
K
>>> if ('delt' + 'a') in l:
...   print('K')
... 
K
>>> if ('delt' + 'a') is l[2]:
...   print('K')
... 
K

【问题讨论】:

  • python 编译器将字符串文字 'delt' + 'a' 合并到 'delta' 中,然后检查是否存在重复项。如果你想在运行时生成一个非实习的字符串,请执行''.join('delta') 之类的操作。
  • @tdelaney 对解释器如何检查实习重复以及如何避免它的评论表示赞赏!

标签: python


【解决方案1】:

根据 python documentation,对于内置容器类型in 测试身份和相等性。这是相关行:

对于 list、tuple、set、frozenset、dict 或 collections.deque 等容器类型,表达式 x in y 等价于 any(x is e or x == e for e in y)

编辑:根据 juanpa.arrivillaga 的评论更新了答案,对于非内置容器类型,行为取决于实现。

【讨论】:

  • 嗯,不。不必要。这是内置容器数据类型的行为。其他类型的行为取决于实现者。需要注意的是,这是一种优化
  • 参考文档值得一读。 in 可能会使用迭代器。带有打开文件句柄的in 测试将导致读取行,直到找到匹配的行(或文件指针结束于 EOF)。
  • @juanpa.arrivillaga “这是一种优化” - 尽管 Raymond Hettinger said 在讨论这个问题时:“身份意味着平等” " 规则不仅仅是一种优化,它是贯穿语言实现的深层假设。
猜你喜欢
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2014-06-04
相关资源
最近更新 更多