【问题标题】:Why does "[] is [ ]" evaluate to False in python为什么“[] is []”在python中评估为False
【发布时间】:2017-03-02 10:46:57
【问题描述】:

在交互式 python shell 中试试这个。

[] is [ ]

上面返回False,为什么?

【问题讨论】:

  • 也许你应该解释一下为什么你认为它应该是真的?
  • [] is [] 也会失败:两者是不同的对象is 进行引用相等检查
  • 为什么会这样呢?您创建了两个空的可变对象,您不会希望它们是同一个对象。
  • @Giacomod'Antonio:但这很容易研究。 OP 没有分享他们的任何研究,也没有解释为什么他们认为这个表达是正确的。您假设他们将is==(值相等运算符)混淆了,但也许他们认为它会更有效?例如,对于两个空元组表达式,这将是真的:() is ()1 is 1 也是如此。
  • @BillalBEGUERADJ:研究不力!= 题外话。我假设没有研究只是因为问题中没有任何其他显示。

标签: python list


【解决方案1】:

您创建了两个可变对象,然后使用is 查看它们是否是相同的对象。那肯定会返回False,否则会损坏。

您永远不会希望 is 在这里返回 true。想象一下,如果你这样做:

foo = []
bar = []
foo.append(42)

如果bar 现在包含42,您会感到非常惊讶。如果 is 返回 true,这意味着两个 [] 调用返回完全相同的对象,那么附加到 foo 将在对 bar 的引用中可见。

对于不可变对象,缓存对象是有意义的,此时is可能返回true,就像使用空元组:

>>> () is ()  # are these two things the same object?
True

CPython 实现优化了空元组的创建;您将始终获得完全相同的对象,因为这样可以节省内存并使某些操作更快。因为元组是不可变的,所以这是完全安全的。

如果您希望改为测试 值相等,那么您得到了错误的运算符。请改用== 运算符:

>>> [] == []  # do these two objects have the same value?
True

【讨论】:

    【解决方案2】:

    在 python is 中,reference equality check 像 [] 和 [] 它们是不同的对象,您可以通过

    进行检查
    print id([]),id([])
    


     In [1]: id([])
    Out[1]: 140464629086976
    
    In [2]: id([])
    Out[2]: 140464628521656
    

    两者都会返回不同的地址,并且都是不同的对象,所以总是会给出错误

    [] is []
    

    输出

    false
    

    【讨论】:

    • 那些id 测试并没有按照您的想法进行。 print 打印相同的数字两次是很常见的,因为列表没有重叠的生命周期。同样,这就是为什么您的 == 测试与 id 值给出 True 而不是 False。
    【解决方案3】:

    [] 就像list(),如果你这样做:

    a = list()
    b = list()
    

    显然ab 是两个完全不同的对象,因此:

    a is b # False
    

    喜欢

    list() is list() # False
    

    喜欢

    [] is [] # False
    

    【讨论】:

    • 为什么创建空列表对象的方式很重要?
    • @MartijnPieters,没关系,可能是我解释的不好,或者你没看懂我要解释什么?
    • 我的意思是不管你用[] is []还是list() is list();两个表达式都创建空列表对象。说 [] 就像 list() 你没有解释为什么is 测试返回False,因为[]list() 之间的区别并不重要这里。此外,您的 == False 测试不正确;您正在测试 (a is b) and (b == False),因为 Python 比较运算符是链式
    • @MartijnPieters,好吧,所以我解释得很糟糕,我只是指出 []list() 都构建对象,并且在每个调用中都构建不同的对象,所以很明显 [] is []将被评估为假。关于操作符,我只是在放松和编写 python sintax 来说明这一点,而不是编写可靠的 python 代码,对不起。
    【解决方案4】:

    == 运算符比较两个操作数的值并检查值是否相等。而is 运算符检查两个操作数是否引用同一个对象。

    id('') : 139634828889200
    id('') : 139634828889200
    id('') : 139634828889200
    
    id([]) : 139634689473416
    id([]) : 139634689054536
    id([]) : 139634742570824
    

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2019-04-24
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多