2017-02-22 48 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が私が 'lst = sortedLst'を実行するときに私のsortedLstに変更されないのかについては理解していますが、なぜlst.pop()内部の? ありがとう – Adam

+0

名前、参照(ポインタ)と値の違いについて知っていますか? – MSeifert

答えて

0

ここでは、グローバル変数はまったく変更しません。

insertionSort関数内でグローバルとして宣言することでこれを修正できますが、私はあなたが望む理由は分かりません。単にsortedLstを返して印刷する方がはるかに良いでしょう。

+0

私の元の 'lst = [3,2,1]'は、最も外側のスコープで宣言されて以来、グローバル変数として分類されていません。 また、私は私のsortedLstを返すことができることを知っていますが、なぜ私の元のlstが[3,2,1]から[]に変更されたのでしょうか? すぐにお返事ありがとうございます。 – Adam

+1

いいえ、そのグローバル変数は、関数自体の 'lst'パラメータによってシャドウされているためです。彼らはもともと同じリストを指しているので、あなたの 'pop'がうまく動作します。ローカル名 'lst'を' sortedLst'を指すように再割り当てすることでそれを打ち破ります。参照を保持したい場合は、 'lst [:] = sortedLst'を実行することができます。 –

+1

私は今理解しています。私はこの問題についてもっと良い方法があることを知っていますが、なぜこれが起こったのか理解したいだけでした。ありがとうございました :) – Adam

関連する問題