内部函数的代码是什么时候;“可用”;在python3中使用外部函数?

内部函数的代码是什么时候;“可用”;在python3中使用外部函数?,python,python-3.x,nested-function,Python,Python 3.x,Nested Function,您好,我正在研究算法,我已经编写了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

您好,我正在研究算法,我已经编写了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)
def快速排序(mylist,l,r):
如果l
然而,当我运行这个时,我得到了

UnboundLocalError:赋值前引用的局部变量“partition”

解决方法是移动
快速排序
顶部的内部函数
分区
的定义,以便它在定义之前不会调用
分区


但我不明白为什么,我的猜测是,在外部函数实际执行之前,内部函数并不“存在”。有人能帮我澄清一下这一点吗?

在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
。。。要工作,由于变量尚未定义,尚未定义的函数调用也是无效的

与任何其他变量一样,将来声明的定义也仅在该将来有效,并且一旦重新定义,它将被废弃