Pythonで次のコードを実行した場合、
var = [0].extend(range(1,10))
次にvar
、値が 0 ~ 9 のリストになります。
何を与える?
list.extend
is an in-place method. It performs its action on the object itself and returns None
.
This would work:
var = [0]
var.extend(range(1, 10))
Even better would be this:
var = list(range(10))
extend() doesn't return anything (actually None
), it does the change "in-place", i.e., the list itself is modified.
I think you are after this:
>>> var = [0]
>>> var.extend(range(1, 10))
>>> var
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
問題のコードが機能するには、次のようなことを行う必要があります。
>>> var = [0]
>>> var.extend(range(1,10))
>>> var
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
extend()がを返すため、以前は機能していませんでした。これはNone
仕様によるものです。Pythonはコマンド/クエリ分離を順守しています。
オスカー・ロペスらがすでに説明しているように、extend はコマンドとクエリの分離を順守するために、None を返すコマンドです。
彼らは皆、意図したとおり、extend をコマンドとして使用してこれを修正することを提案しました。ただし、代替手段があります。代わりにクエリを使用します。
>>> var = [0] + range(1, 10)
ここで違いを理解することが重要です。extend
あなたの を変更し、[0]
に変えます[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
。しかし、+
演算子はあなた[0]
を放っておいて、新しい list を返します[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
。
リストへの他の参照があり、それらすべてを変更したい場合は、明らかに必要extend
です。
ただし、値として [0] を使用しているだけの場合、使用+
するとコンパクトで流動的なコードを記述できるようになるだけでなく (しようとしていたように)、値の変更も回避できます。これは、リストの代わりに不変値 (タプルなど) を使用している場合でも同じコードが機能することを意味しますが、さらに重要なことは、副作用を回避する関数型プログラミングのスタイルにとって重要なことです。(このスタイルが便利な理由はたくさんありますが、明らかな理由の 1 つは、不変オブジェクトと副作用のない関数が本質的にスレッドセーフであることです。)