python-3.x 我不知道为什么这些代码不会遇到IndexError

brvekthn  于 2023-03-04  发布在  Python
关注(0)|答案(2)|浏览(165)
class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        checked = {}
        i = 0
        while target - nums[i] not in checked:
            print(i)
            checked[nums[i]] = i
            i += 1

        return [checked[target - nums[i]], i]

print(Solution().twoSum([3, 2, 4], 6))

我想知道为什么第5行在执行while循环时没有IndexError。
例如,nums = [3,2,4],target = 6,执行完第5、6行后,当i=2时,i在下一个while循环中增长到3,而nums[3]正常情况下会引发IndexError,但实际上并没有,为什么这些代码可以正确地解决问题而不引发Error?

xqkwcwgp

xqkwcwgp1#

使用带有调试器的IDE,例如PyCharm Community edition。它是免费的,每个编程人员都需要了解how to debug small programs
调试器允许你一行一行地调试你的代码,并且它会在每一行之后显示变量的内容。当你这样做的时候,总是把它和你期望的程序做比较。
使用调试器逐行调试代码,您会发现它不会抛出IndexError,因为它不会遇到代码访问无效索引的情况:
1.选中的是{}

  1. i为0
    1.进入while循环,因为checked为空
    1.选中变为{3:0}
  2. i变为1
  3. target-nums[i]是4,字典中没有
    1.选中变为{3:0, 2:1}
  4. i变为2
  5. target - nums[i]是6-4是2字典里有
    1.跳过while循环
    1.返回[checked[2], 2],即[1, 2]
    调试信息如下所示:

o3imoua4

o3imoua42#

while循环在i到达2时终止,因为while中的表达式被求值为false,如下所示。
1.当i = 0且表达式计算为真时,目标- nums[0] -〉6 - 3 -〉3未选中-〉是已选中= {3:0}
1.当i = 1且表达式计算为真时,目标- nums[1] -〉6 - 2 -〉4未选中-〉是已选中= {3:0,2:1}
1.当i = 2,表达式求值为假且循环在此终止时,目标- nums[2] -〉6 - 4 -〉2不在选中状态-〉假

  1. return语句执行return [已检查[目标-编号[i]],i] -〉return [已检查[6 - 4],2] -〉return [已检查[2],2] -〉return [1,2]“”
    希望它是清晰的

相关问题