即使我创建了两个单独的列表,为啥 if 条件为真

Posted

技术标签:

【中文标题】即使我创建了两个单独的列表,为啥 if 条件为真【英文标题】:Even though I have created two seperate lists, why is the if condition true即使我创建了两个单独的列表,为什么 if 条件为真 【发布时间】:2018-06-29 15:29:54 【问题描述】:
even = [10, 4, 6, 8]
another_even = list(even)
print(another_even is even)
if another_even == even:
    another_even.sort( reverse=True )
    print(even)
else:
    print("Yay")

输出: 假的

[10, 4, 6, 8]

即使我创建了两个单独的列表,为什么 if 条件为真。

【问题讨论】:

Is there a difference between `==` and `is` in Python?的可能重复 if 条件为 True 因为两个对象相等但不是同一个对象。它们是两个不同的容器,里面的数字相同。 list(data) 从 data 中的数据创建一个新列表。数据可以是任何可迭代的。在这种情况下,数据也是一个列表的巧合。 【参考方案1】:
even = [10, 4, 6, 8]
another_even = list(even)

even 是一个列表 another_even 是您使用 even 中的元素构建的不同列表。

注意:不同。它们是两个不同的对象。

这就是为什么:

print(another_even is even)

打印False。这是因为evenanother_even 不是同一个对象。

如果你这样做了:

another_even = even

你会得到True

但现在你测试平等

if another_even == even:
    another_even.sort( reverse=True )
    print(even)
else:
    print("Yay")

== 会将even 中的元素与another_even 中的elements 进行比较。因为列表和元素的长度相等,所以比较结果为 True,然后执行以下代码:

    another_even.sort( reverse=True )
    print(even)

您可以将== 比较视为执行其他代码:

result = True
for x, y in zip(even, another_even):
    if x != y:
        result = False
        break

元素是一对一比较的,如果一对不相等,结果将为 False。在您的情况下,所有元素都是平等的。

注意:您可以这样做检查对象evenanother_even 是否不同:

print(id(even))
print(id(another_even))

而且输出会有所不同,因此False 来自even is another_even

【讨论】:

以上是关于即使我创建了两个单独的列表,为啥 if 条件为真的主要内容,如果未能解决你的问题,请参考以下文章

即使路径不存在,为啥 Path(...).exists 为真? [复制]

为啥我的 WPF 应用程序禁用了拖放(即使 AllowDrop 为真)?

为啥即使条件为假,这个“IF”也总是执行?

即使两个参数都为真,如果语句返回假?

Oracle:两个条件都为真时的条件非空约束

条件语句在 if-else-if 阶梯的两个部分都为真