2017-02-22 58 views
-1
def insertionSort(lst): 
    #create variable to store final sorted list 
    sortedLst = [] 
    #add any number into the list so the program can start inserting 
    sortedLst.append(lst.pop()) 

    #for each item left over in the original list compare to sorted list 
    for sortInd in range(len(lst)-1,-1,-1): 
    #for each index to sort 
     for sortingInd in range(len(sortedLst),-1,-1): 
      if sortingInd == 0 or sortingInd == len(sortedLst): 
       sortedLst.insert(sortingInd,lst.pop()) 
       break 
      if lst[sortInd] > sortedLst[sortingInd]: 
       sortedLst.insert(sortingInd,lst.pop()) 
       break 

    print(sortedLst) #gives [1,2,3] 
    print(lst) #gives [] 
    lst = sortedLst 
    print(lst) #gives [1,2,3] 

lst = [3,2,1] 
insertionSort(lst) 
#lst should be [1,2,3] yet gives [] 
print(lst) 

Я пытаюсь запрограммировать сортировку вставки, сама сортировка вставки действительно работает, поскольку это часть большего числа типов, которые я запрограммировал, я специально не хочу объявлять новую переменную для отсортированного списка вне функции и функция возвращает отсортированный список, чтобы он соответствовал моим другим функциям. например, я не хочу:Глобальные переменные изменялись только в некоторых случаях

lst = [3,2,1] 
newLst = insertionSort(lst) 

Вместо этого я хочу функцию, чтобы изменить сортировку вставок моего оригинальный LST переменными и это изменится, когда я сую значение для сортировки, но не меняется, когда я поставил его на sortedLst до функция заканчивается.

Заранее благодарю за любые ответы :).

+0

Python имеет отличную документацию, это должно быть объяснено в разделе [модель исполнения] (https://docs.python.org/3/reference/executionmodel.html). Например, 'lst' внутри вашей функции ** не является **' lst' вне вашей функции и что 'lst = x' не копирует' x'. – MSeifert

+0

Хм, я это понимаю, и есть смысл, почему мой lst не изменился на мой sortedLst, когда я делаю «lst = sortedLst», но почему lst.pop() фактически появляется из моей первой вне функции, а не только внутри? Thanks – Adam

+0

Вы знаете о различии между именами, ссылками (указателями) и значениями? – MSeifert

ответ

0

Вы вообще не меняете глобальных переменных.

Вы можете исправить это, объявив lst глобальным в своей функции insertionSort, но я не уверен, почему вы хотите; было бы намного проще просто вернуть sortedLst и распечатать это.

+0

Является ли мой исходный 'lst = [3,2,1]' не классифицированным как глобальная переменная, так как он объявлен в самой внешней области. Кроме того, я знаю, что могу вернуть свой sortedLst, но мне интересно, почему мой первоначальный lst изменен с [3,2,1] до [], но не с [] на мой sortedLst. Благодарим за быстрый ответ. – Adam

+1

Нет, поскольку эта глобальная переменная затеняется параметром 'lst' самой функции. Так получилось, что они изначально указывают на один и тот же список, поэтому ваш 'pop' работает; но тогда вы нарушите это, переназначив локальное имя 'lst', чтобы указать на' sortedLst'. Если вы хотите сохранить ссылку, вы можете сделать lst [:] = sortedLst'. –

+1

Я понимаю сейчас. Я знаю, что есть более эффективные способы решения этой проблемы, но я просто хотел понять, почему это происходит. Спасибо :) – Adam