Я написал код для быстрой сортировки. Но я не знаю, почему это происходит NameError? - PullRequest
0 голосов
/ 02 мая 2020

Я написал этот код для быстрой сортировки.

def partition(a,start = 0,end = len(a)-1):
    pivot = a[0]
    while start<end:
        while a[start]<=pivot:
            start+=1
        while a[end]>pivot:
            end-=1
        a[start],a[end] = a[end],a[start]
    pivot,a[end] = a[end],pivot
    return end

def quicksort(a,lb =0,ub =len(a)-1):
    if lb<ub:
        loc = partition(a,lb,ub)
        quicksort(a,lb,loc-1)
        quicksort(a,loc+1,ub)

A = [3,5,1,7,9,6,2]

B = quicksort(A)

print(B)

Я не знаю, почему происходит NameError. а является параметром функции. До ошибки подачи.

Traceback (most recent call last):
  File "/data/data/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 31, in <module>
    start(fakepyfile,mainpyfile)
  File "/data/data/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 30, in start
    exec(open(mainpyfile).read(),  __main__.__dict__)
  File "<string>", line 1, in <module>
NameError: name 'a' is not defined

[Программа завершена]

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Нельзя использовать параметр при вычислении значения по умолчанию другого, потому что они вычисляются при определении метода, а не при вызове метода, поэтому нельзя использовать другие, значение по умолчанию должно быть неизменным

Вы можете использовать None в качестве значения по умолчанию и проверить его

def quicksort(a, lb=0, ub=None):
    ub = len(a) - 1 if ub is None else ub
    #...


def partition(a, start=0, end=None):
    end = len(a) - 1 if end is None else end
    #...
1 голос
/ 02 мая 2020
def quicksort(a,lb =0,ub =len(a)-1):

- да, a - это параметр, и он будет определен в теле функции quicksort, но в настоящий момент вы пытаетесь получить len(a), но он еще не определен. Я предлагаю следующее изменение:

def quicksort(a,lb=0,ub=None):
    if ub is None:
        ub = len(a)-1

, а остальная часть вашего кода остается без изменений.

...