为什么Python编译这段代码时没有抛出错误?

为什么Python编译这段代码时没有抛出错误?,python,compiler-errors,Python,Compiler Errors,我是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 = what

我是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
def b_搜索(左、右):

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


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

从您提供的代码中,看起来您没有运行函数,因此代码没有被执行,也没有使用不存在的变量

声明函数后,如果尝试调用它,将发现以下错误:

>>> 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
>>b_搜索(3,9)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第4行,在b_搜索中
NameError:未定义名称“nums”

我确信这是一个重复的问题,但我找不到。我也是,我在找不到类似问题时发布了这篇文章。肯定Python新手以前一定有过这个问题?@KarlKnechtel-这只是范围规则。我不知道为什么这对每个人来说都是一个启示。这不仅仅是“范围规则”;本地与全局是运行时与编译时名称查找的独立问题。这对许多人来说是一个启示,因为许多其他编程语言的工作方式不同。此外,在大多数情况下,局部变量在字节码编译时被解析。如何处理全局变量和如何(通常)处理局部变量之间的差异可能令人困惑。(编译时不解析局部变量的主要情况是使用类作用域和
exec
)这很有帮助,谢谢。来自Java的背景,这让我震惊了一分钟。