【问题标题】:Unexpected result when returning a boolean from a function in Python从 Python 中的函数返回布尔值时出现意外结果
【发布时间】:2021-09-08 10:01:54
【问题描述】:

我正在尝试编写一个 Pyhon 函数来检查列表是否包含给定的索引号。

def ncheck(n, list):
    for x in range(len(list)):
        if n == x:
            return True
        else:
            return False

我使用以下参数测试了代码:

print(ncheck(6, [0, 1, 2, 3]))
print(ncheck(2, [0, 1, 2, 3]))

我预计第一次运行会返回 False,因为它正在寻找包含 4 个元素的列表中的索引 6,而第二次运行会返回 True,因为它正在寻找索引 2。实际发生的是两次运行都返回 @987654325 @。我认为可能在 if 块内有 return 会导致问题,所以我尝试在 if 块内分配另一个变量“answer”并将此变量作为函数的结束语句返回,但得到了相同的结果:

def ncheck(n, list):
    for x in range(len(list)):
        if n == x:
            answer = True
        else:
            answer = False
    return answer

print(ncheck(6, [0, 1, 2, 3]))
print(ncheck(2, [0, 1, 2, 3]))

False
False

我很茫然。除了解决此问题的替代方法之外,我还想了解为什么这种方法特别不起作用。

【问题讨论】:

  • list 在 python 中是一个内置函数,所以现在你将它隐藏在你的函数中,所以使用不同的名称。
  • 但为什么不只是return n < len(list)? (抛开list 是一个错误的变量名,正如@Khaled 提到的那样)或者更好,只是在您打算调用此函数的任何地方捕获IndexError
  • 您应该在此处提问之前使用调试器。了解 pdb 和一般调试。

标签: python list function boolean


【解决方案1】:

您的代码目前只检查 first 数字,如果 所有 数字不匹配,您的 else 将运行:

def ncheck(n, list):
    for x in range(len(list)):
        if n == x:
            return True
    return False # after exiting the for loop

print(ncheck(6, [0, 1, 2, 3]))
print(ncheck(2, [0, 1, 2, 3]))

返回

False
True

另外,请注意 range 实际上能够以 O(1) 操作的形式执行此操作,因此执行此操作的首选方式(与 list 的长度无关)是:

def ncheck(n, list):
    return n in range(len(list))

您可以查看this answer了解更多详情。

【讨论】:

  • 或者只是return n < len(list)
  • 如果数组实际上只是增量 1,则使用最后一种方法将起作用,如果数组不是此数字序列,则将失败。
  • @DeepSpace 问题中的示例检查范围,这意味着在这种情况下,n 的负值是不需要的。
  • @Khaled 我将问题解释为“我如何检查n 是否是我列表中的有效、非负索引”。您可以从 OP 的示例中看到他们也使用了range,因为他们没有尝试与列表中的元素进行比较,因此列表中的元素应该是无关紧要的。
  • @Kraigolas OP 只是试图将 n 与列表的 length 进行比较,根据定义,它不能为负数,所以我不确定是什么负数与此有关。如果您真的想防止将True 用于负面输入,只需使用return 0 <= n < len(list)。这里真的不需要一个令人困惑的循环
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2011-05-19
  • 1970-01-01
相关资源
最近更新 更多