2016-06-17 6 views
0

私は以下の動作を把握しようとしています。具体的には、割り当てられているのはy /割り当てられている理由です。下の例ではy = y.extend(z)と設定しています。私はそれがNoneTypeオブジェクトであることがわかります、私はちょうど完全にを取得していないよ、なぜ。例えば。 この機能の潜在的な用途は何ですか? y.extend(z)はインプレース突然変異操作です - その場合、私の現在の考えは私がNoneTypeの戻り値ではなく、変数に代入しようとするとエラーが発生することが予想されます。なぜ私は間違っているのですか/なぜPythonがこのように構築されているのですか/ Noneが役に立つのはどうですか?y.extend(z)によってNoneTypeが返されますか?

>>> x = [] 
>>> y = [] 
>>> z = [1, 2] 
>>> x.extend(z) 
>>> x 
[1, 2] 
>>> y = y.extend(z) 
>>> y 
>>> y.extend(z) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'extend' 

あなたにいくつかのコンテキストを与えるために、私はこのような何かをしようとしていた。

l = l[:x].extend(y) 

私は今、次のように私が行う必要があります知っている:

l = l[:x] + y # where y is already a list 
+1

[なぜこのコードでappendがnoneを返すのですか?](http://stackoverflow.com/questions/16641119/why-does-append-return-none-in-this-code)または[なぜ"return list.sort()"は返されません、リストではありませんか?](http://stackoverflow.com/questions/7301110/why-does-return-list-sort-return-none-not-the-list) –

+1

なぜあなたはエラーを予期しますか?変数にNoneを代入するのは完全に有効です。 –

+0

'[変更可能な配列型](https://docs.python.org/2/library/stdtypes.html#mutable-sequence-types)の多くのメソッドは、' list'のようにオブジェクトをインプレースで変更します。値を返します( 'None'を返すのと同じです)。' extend() 'と' append() 'メソッドは2つあります。 – martineau

答えて

1

.extendはしていません変更された配列を返します。単にその拡張を実行します。つまり、yは変更されますが、関数は何も返しません。

>>> y = [] 
>>> y.extend([1, 2]) 
>>> y 
[1, 2] 
+3

'extend'はNoneを返します。関数は常に値 – Leva7

+0

を返します(値の欠如を表すためには何も使用されません)。(https://docs.python.org/2/library/constants.html#None)tho。 extendは何も返さないので、関数を実行した結果はNoneです。P –

+0

これはほぼ同じことです。 –

0

リストの拡張メソッドは、新しいリストを返す代わりにリストを直接変更します。

あなたはちょうど私がy.extend(z)がインプレース突然変異操作であることがわかり

y.extend(z) 
2

を行う必要があります - 私がしようとしたとき ケースであること、私はエラーを期待すること変数を 変数に代入するには、NoneType、n'est pas?

なぜですか? extendは何も返さず、Pythonに関してはNoneを返します。あなたは変数にNoneを割り当てています。これはPythonでもうまくいきます。その後、Noneから何かを呼び出そうとしていますが、これは明らかに無効です。

+0

私はそれを得ます - しかし、何も返すことのポイントは何ですか?変数にNoneを代入したいのであれば、それを代入するだけで、関数の結果は代入しません。 – NotAnAmbiTurner

+1

@NotAnAmbiTurner: 'list.extend()'がリストを**変更するためです**。新しいリストは作成されません。 Pythonの規約では、すでにオブジェクトへの参照があるため、 'None'を返します。 'dict.update()'、 'set.add()'などにも同じことが言えます。 –

+0

@MartijnPietersそれは知っておきたいことなので、私の質問はなぜそれがコンベンションなのか、あるいは理由があるのでしょうか? – NotAnAmbiTurner

関連する問題