【问题标题】:Why does 'not in' return True with 2-dimensional lists that contain the cited value in their inner lists [duplicate]为什么'不在'返回True,二维列表在其内部列表中包含引用值[重复]
【发布时间】:2020-09-20 03:07:17
【问题描述】:

我希望此语句返回 False。显然列表中有很多 0,但它返回 True。

zeros = [[0] * 8] * 8 
print(0 not in zeros) 
# True

有人可以解释这种行为吗? 另外,我可以使用其他表达式来计算结果为 False 吗?

【问题讨论】:

    标签: python list boolean


    【解决方案1】:

    zeros

    >>> zeros
    [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
    

    zeros 的所有元素都是[0, 0, 0, 0, 0, 0, 0, 0]。他们都不是0

    如果您只是想要一个评估为False 的语句,当然有:

    >>> print(False)
    False
    

    但是如果您想专门测试0s 的任何元素中是否没有任何zeross,您可以这样做:

    >>> print(not any(0 in z for z in zeros))
    False
    

    【讨论】:

    • >>> print(not any(0 in z for z in zeros)) False 这就是我想要做的。现在我理解了这种行为。
    【解决方案2】:

    in 运算符只查看zeros 的元素,这些元素是[0] 而不是0。因此它返回false。您可以将其转换为 numpy.array,并根据需要为其定义 in 运算符。

    from numpy import array
    zeros = array([[0] * 8] * 8) 
    print(0 not in zeros) 
    # False
    

    请注意,如果数组是浮点类型,则需要测试0.0

    【讨论】:

    • 在其他人把它涂抹在我脸上之前发表评论:你永远不会写zeros = array([[0] * 8] * 8) ...我假设你的实际应用程序是另一个二维数组。
    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多