2

私はpython 2.7で遊んでいます。これが私の問題です:

>>> bra=[]
>>> put=['a','t']
>>> bra.append(put)
>>> bra
[['a', 't']]
>>> bra.append(put)
>>> bra
[['a', 't'], ['a', 't']]
>>> bra.append(put.reverse())
>>> bra
[['t', 'a'], ['t', 'a'], None]

私の質問は: Python インタープリターが最後の行にその結果を与えるのはなぜですか?

[['a', 't'], ['a', 't'], ['t', 'a']]

またはどうすればこの結果を得ることができますか?

4

2 に答える 2

5

2 つの問題:

  1. このlist.reverseメソッドはリストをその場で変更し、何も返しません (つまり、 を返しますNone)。reversedおそらく代わりにメソッドを使用したかったでしょう。
  2. リストの最初の 2 つの要素は両方とも、bra基になる同じオブジェクトを参照しています。したがって、そのオブジェクトを変更すると、最初の 2 つの要素の両方が同じ変更されたオブジェクトを再び参照したため['t', 'a']、最初の 2 つの要素の両方が表示されます。

同じオブジェクトへの参照ではなく別のオブジェクトを使用する場合は、スライス演算子を使用してコピーを作成できます。

bra.append(put[:])  # Appends a copy of 'put'

メソッドの代わりにreversed、スライシング演算子を -1 のステップで使用して iterable を逆にすることもできますが、一部の人にとっては、コードが何をしているのかがそれほど明白ではありません。

bra.append(put[::-1])  # Equivalent to bra.append(reversed(put))
于 2012-11-08T20:55:49.817 に答える
4

list.reverse()リストをインプレースで変更し、何も返しません。これは、を返すのと同じNoneです。

必要reversed(put)です。この関数は、実際にiterableの逆バージョンを返します。

于 2012-11-08T20:53:42.790 に答える