当前位置: 首页 > 面试题库 >

使对象x使得“ [x]中的x”返回False

史宸
2023-03-14
问题内容

如果我们像这样制作病理马铃薯:

>>> class Potato:
...     def __eq__(self, other):
...         return False
...     def __hash__(self):
...         return random.randint(1, 10000)
... 
>>> p = Potato()
>>> p == p
False

我们可以打破集和类型的字典这种方式( 注: 这是相同的,即使__eq__回报率True,它与打破他们的哈希碴):

>>> p in {p}
False
>>> p in {p: 0}
False

另外len({p: 0, p: 0}) == 2,并{p: 0}[p]引发KeyError,基本上所有与映射有关的东西都按预期方式出了窗。

但是我没想到的是,我们 无法 打破名单

>>> p in [p]
True

这是为什么?似乎在list.__contains__迭代,但是它首先检查身份,然后再检查相等性。由于身份并非意味着平等(例如参见NaN对象),所以列表在身份比较中短路的原因是什么?


问题答案:

listtuple等等确实确实在进行相等检查之前进行了身份检查,并且这种行为是由这些不变量引起的:

assert a in [a]
assert a in (a,)
assert [a].count(a) == 1
for a in container:
    assert a in container    # this should ALWAYS be true

不幸的是,dicts,sets和朋友通过哈希操作,因此,如果您将它们弄乱,则确实可以有效地破坏它们。

有关某些历史记录,请参见此问题和此问题。



 类似资料:
  • 问题内容: 当我以root身份输入Python时,它将返回,但是当我尝试将其分配给变量时,会将x的值设置为0。为什么?(: 问题答案: 返回(编码的)进程出口值。意味着成功: 在Unix上,返回值是以指定的格式编码的进程的退出状态。请注意,POSIX没有指定C system()函数的返回值的含义,因此Python函数的返回值与系统有关。 您看到的输出将写入,因此您的控制台或终端不会返回给Pytho

  • 本文向大家介绍写一个方法,使得sum(x)(y)和sum(x,y)返回的结果相同相关面试题,主要包含被问及写一个方法,使得sum(x)(y)和sum(x,y)返回的结果相同时的应答技巧和注意事项,需要的朋友参考一下 此题考函数式编程: const sum = (x, y) => (typeof y === "undefined") ? (y)=> x+y : x+y console.log(sum

  • 基于此,我认为我应该完全开始在中使用

  • 我有一个方法,按顺序调用4个其他方法来检查特定条件,并且每当返回Truthy的内容时立即返回(不检查以下内容)。 这似乎有很多行李编码。我宁愿这样做,而不是每个2行if语句: 但这是无效的Python。我是否错过了一个简单、优雅的解决方案?顺便提一下,在这种情况下,这四种检查方法可能很昂贵,因此我不想多次调用它们。

  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1

  • 以下Python3.x整数乘法的平均运算时间在1.66s到1.77s之间: 如果将替换为,则需要在和之间。怎么会呢? 另一方面,在Java中则相反:在Java中更快。Java测试链接:为什么在Java中2*(i*i)比2*i*i快? 我运行每个版本的程序10次,以下是结果。