Когда код для внутренней функции «доступен» для использования внешней функцией в python3? - PullRequest
0 голосов
/ 06 января 2019

Здравствуйте, я работаю над алгоритмами и написал рабочую версию быстрой сортировки, см. Код ниже:

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: локальная переменная 'section', указанная перед присваиванием

И исправление состоит в том, чтобы переместить определение внутренней функции partition в верхнюю часть quickSort, чтобы она не вызывала partition до ее определения.

Но я не понимаю, почему, я предполагаю, что внутренние функции не «существуют» до того, как внешние будут фактически выполнены. Может кто-нибудь прояснить этот вопрос для меня?

1 Ответ

0 голосов
/ 06 января 2019

В 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

... для работы, поскольку переменная еще не определена, вызов функции, которая еще не была определена, также недопустим.

Как и с любой другой переменной, определение, указанное в будущем, также действительно только в этом будущем и устареет, как только оно будет переопределено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...