内层函数"available"的代码什么时候用在外层函数python3?

When is the code for an inner function "available" for the outer function to use in python3?

你好,我正在研究算法,我已经编写了一个 quickSort 的工作版本,请参见下面的代码:

def quickSort(mylist, l, r):
    if l < r:
        q = partition(mylist, l, r)
        quickSort(mylist, l, q-1)
        quickSort(mylist, q+1, r)

    def partition(mylist, l, r):
        i = l-1
        j = l
        while j < r:
            if mylist[j] < mylist[r]:
                i += 1
                mylist[i], mylist[j] = mylist[j], mylist[i]
            j += 1
        mylist[i+1], mylist[j] = mylist[j], mylist[i+1]
        return i+1

mylist = [54,26,93,17,77,31,44,55,20,22]
l = 0
r = len(mylist) -1
quickSort(mylist, l, r)

但是当我 运行 我得到

UnboundLocalError: local variable 'partition' referenced before assignment

修复方法是将内部函数 partition 的定义移动到 quickSort 的顶部,这样它就不会在定义之前调用 partition

但我不明白为什么,我的猜测是在实际执行外部函数之前,内部函数不会 "exist"。有人可以为我澄清这一点吗?

在 python 中,您可以将函数视为可调用变量。

例如,您可以将它们分配给变量名,如下例所示:

def example_function():
    print("Hello world!")

example_var = example_function
example_var() # call the variable!

正如您可以重新分配变量一样,您也可以重新分配函数定义,这意味着函数的定义不是全局的:

def my_function():
    print("first")

my_function() # prints "first"

def my_function():
    print("redefined")

my_function() # prints "redefined"

所以正如你不会期望的那样...

# a _not_ defined above
print(a) # even if this worked, should it print "3" or "4"?
a = 3
a = 4

...工作,因为尚未定义变量,调用尚未定义的函数也是无效的。

与任何其他变量一样,在未来陈述的定义也仅在该未来有效,一旦重新定义就会过时。