2012-03-08 2 views
-2

これは私が再割り当てが働い作成しtuple3Python、これはバグですか?タプル内のリストにNoneが追加されますか?

In [65]: arf=(0,1,[1,2,3]) 

In [66]: arf=(arf[0],arf[1], arf[2]) 

In [67]: arf 
Out[67]: (0, 1, [1, 2, 3]) 

を更新し、私は長い時間で

を書いた最短例の一つです。

今、私はその内容を変更しようとしています。

In [69]: arf=(arf[0],arf[1], [2]) 

In [70]: arf 
Out[70]: (0, 1, [2]) 

In [71]: arf=(arf[0],arf[1], arf[2].append(3)) 

In [72]: arf 
Out[72]: (0, 1, None) 

戻ってきませんか?名前:ねえ、何を与えるか。申し訳ありません、私はPythonのnoobです。

答えて

5

list.append()は常にNone

のでarf[2].append(3)arf3を追加して返します返しNone

あなたはすぐに新しく作成されたタプル

からarfを再バインドしているためarf[2]にこの変更を確認するために取得することはありませんおそらくこれがあなたが望むものです

arf = (arf[0], arf[1], arf[2]+[3]) 
+0

ああ、私はすべてをラムダ関数に絞ろうとしています。中間変数の作成を避ける方法はありますか? –

+0

@BryanHuntはラムダに絞ろうとするのを止めます:名前付き関数を使うだけで、何も失われません。 – Duncan

+0

おかげで、うまく動作します。 –

3

list.appendメソッドはリストを置き換え、Noneを返します。これはバグではなく、これはちょうどappendメソッドの仕組みです。

+2

この現象の背後にあるアイデアは、 Command-Query-Separation(例:http://martinfowler.com/bliki/CommandQuerySeparation.html) – stephan

1

appendはdoesnの「[トン新しいリストを返し、それがインプレース古い変更:

>>> a = [1, 2, 3] 
>>> b = a.append(4) 
>>> print b 
None 
>>> print a 
[1, 2, 3, 4] 
0

gnibblerの答えについては詳しく説明し、list.append()リスト自体を変更するが、それはdoesnの」リストの新しい値を返します。 Noneを返します。したがって、あなたのコマンド71はあなたが望むようにarf [2]の値を変更しますが、それはすぐにNoneを返し、arf [2]にそれを設定します。

あなたの例の自己参照は少し難解ですが、someothervariable=arf[2].append(3)のようなコマンドを試してみると、その動作がわかります。 someothervariableNoneに設定され、arf [2]には明示的な代入文を付けずに3が追加されます。

関連する問題