【问题标题】:Why is Python compiling this code without throwing errors?为什么 Python 编译这段代码不会抛出错误?
【发布时间】:2021-03-29 10:12:57
【问题描述】:

我是 Python 新手,请多多包涵。 为什么Python在编译以下代码时不会抛出错误。

def b_search(left, right):
    while left <= right:
        mid = left + (right-left)//2

        if nums[mid] == target:
            return mid
        if nums[mid] < target:
            left = whatever
        else:
            right = mid-1
    return -1

想知道为什么没有定义“nums”,也没有定义“whatever”和“target”。

谢谢!

【问题讨论】:

  • 我确定这是重复的,但我找不到。
  • 我也没有,我在找不到类似问题时发布了这个。对 Python 的新手肯定有过这个问题吗?
  • @KarlKnechtel - 这只是范围规则。我不知道为什么这对每个人来说都是一个启示。
  • 这不仅仅是“范围规则”;本地与全局是与运行时与编译时名称查找不同的问题。这对许多人来说是一个启示,因为许多其他编程语言的工作方式不同。
  • 另外,在大多数情况下,局部变量在字节码编译时被解析。全局变量的处理方式和本地变量(通常)的处理方式之间的区别可能会令人困惑。 (在编译时未解析本地变量的主要情况是类范围和exec。)

标签: python compiler-errors


【解决方案1】:

全局变量在运行时查找,当函数试图访问它们的值时,而不是在定义函数时。如果函数尝试实际使用它时仍然没有 nums 变量,那么此时您将收到 NameError,但在函数定义时不会。

这里的过程不是“查找nums并使用我们找到的信息编译字节码”;它是“编译字节码,如果运行,可能会查找 nums 然后”。

【讨论】:

  • 这有帮助,谢谢。来自 Java 背景,这让我吃了一惊。
【解决方案2】:

从您提供的代码来看,您似乎没有运行该函数,因此该代码没有被执行并且它不使用不存在的变量。

一旦你声明了函数,如果你试图调用它,你会发现这个错误:

>>> b_search(3,9)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in b_search
NameError: name 'nums' is not defined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多