2017-08-12 6 views
0

What is wrong with my radix sort?List [:] = Listはこの基数ソートコードで何をしますか?

ここで、私が見つけた基数ソートコードへのリンクです。それは動作します(一番上の答えのコード)が、私の質問はList [:] = []がこのコンテキストで何をするかです(私はリスト分割のためにその意味を理解しています)。私はあなたがすべての反復の後にバケツからリストを再構築すると仮定しますが、私はその行をList = []に変更するとコードが機能しなくなります。どうしてこんなことに?

答えて

1

はあなたが理解しようとしているものの小型版である以下の場合を考えてみます。

def foo(x): 
    x = [] 
    x.append(1) 
    print(x) 

my_list = [] 
foo(my_list) 
print(my_list) 

あなたはでそれを修正し、それはその後、引数として受け取ってリストをクリアする機能fooを期待します番号1が追加されました。実際には、それは何が起こるかではありません...

>>> foo(my_list) 
[1] 
>>> print(my_list) 
[] 

なぜそうですか?

あなたがx = []を書いたとき、代わりに元のリストをクリアすると、あなたが実際には、新しいリストを参照するために、ローカル変数xを変更したため。一方、my_listはまだ元のリストを参照しています!

それでは、同じではなくx[:]を使用してみましょう:今すぐ

def foo(x): 
    x[:] = [] 
    x.append(1) 
    print(x) 

my_list = [] 
foo(my_list) 
print(my_list) 

、すべてはあなたが期待通りに動作するはずです:

>>> foo(my_list) 
[1] 
>>> print(my_list) 
[1] 

x[:]トリックは基本的に置き換えるにインタプリタを語っていますxによって参照されるリストの内容は、新しい空のリストによって示されます。今、指しているリストに変更されるのはxではありません。実際には、それはまだmy_listと同じリストを参照し、副作用として、これは元のリストを変更します。

実際に何が起こっているのかを実際に把握するには、how variables are passed by assignment in Pythonを参照してください。特にポインターの概念に精通していない場合は、

関連する問題