为什么如果我用“and”运算符交换两个条件的位置,结果会有所不同?

wha*_*pin 0 python algorithm if-statement

所以我正在做一个名为“缺失数字”的练习,我不明白为什么这个语句会导致列表索引超出范围错误。

if nums[i] != nums[j] and nums[i] < len(nums):
Run Code Online (Sandbox Code Playgroud)

但是当我使用这种条件时,代码有效:

if nums[i] < len(nums) and nums[i] != nums[j]:
Run Code Online (Sandbox Code Playgroud)

这两行代码在功能上不是完全相同吗?我在想这可能是优先顺序问题,但即使我将其放在括号中,仍然存在超出范围的错误。

下面是完整的代码:

 def missingNumber(self, nums: List[int]) -> int:
    i, n = 0, len(nums)
    while i < n:
        j = nums[i]
        if nums[i] != nums[j] and nums[i] < n:
            nums[i], nums[j] = nums[j], nums[i]
        else:
            i += 1
    
    for i in range(n):
        if i != nums[i]:
            return i
        
        
    
Run Code Online (Sandbox Code Playgroud)

0x5*_*453 6

Python中的布尔运算符使用短路逻辑,这意味着如果第一个条件为and假,则不会检查第二个条件。因此,条件的顺序很重要。

在您的示例中,由于nums[i]是两个条件的一部分,因此我们可以得出结论,IndexError来自nums[j]。我们还可以得出结论,对于您的输入数据,每当 时nums[i] < nj总是在范围内。nums[j]但是,这可能不适用于所有输入,因此您应该修复逻辑以仅检查if的值j < len(nums)