彼らは言いました。あなたが行うことができますリストを作成している間、あなたが操作を行いたい場合しかし:
arr = [u + 1 for u in range(10)]
私がない限り、(あなたは、Python 2を使用している場合は、xrange
にrange
を変更するには、Python 3を使用していると推定しますリストのサイズは非常に小さい)、Python 2 range
関数が実際にlist
を返しますが、xrange
はイテレータを返します。 Python 3 range
関数は、古いxrange
に似たイテレータを返します(ただし、いくつかの改良点があります)。
arr
では、新しいlist
オブジェクトと現在のlist
オブジェクトを交換することなく、変更する既存list
であれば、あなたは
arr[:] = [u + 1 for u in arr]
を行うことができます。ここarr
を使用した場合の違いを示しているいくつかのコードがあります割り当ての左側にあるarr[:]
。
arr = list(range(10))
b = arr
print(id(arr), id(b))
arr = [u + 1 for u in arr]
print(id(arr), id(b))
print(arr, b)
c = arr
print(id(arr), id(c))
arr[:] = [u + 1 for u in arr]
print(id(arr), id(c))
print(arr, c)
出力
3073636268 3073636268
3073629964 3073636268
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3073629964 3073629964
3073629964 3073629964
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
だからarr = [u + 1 for u in arr]
は、新しいリストオブジェクトに名前arr
を結合するが、arr[:] = [u + 1 for u in arr]
は効果的に既存のリストオブジェクトを変異させます。 "Under the Hood"では、新しい一時的なリストオブジェクトを作成し、その内容を古いリストオブジェクトにコピーします。
後者は効率的ですか? – Clausen
@Clausen:実際には、 'arr = [uのarrのためのu + 1]'を実行するよりも少し遅いですが、リストが大きい場合を除いて速度の違いに気付かないでしょう。しかし、 'arr [:] ='を使用する主な利点は、 'arr'に対する複数の参照がある場合、Martijnが答えで説明するように、それらが有効であるということです。単に 'arr ='を使うと、他の参照は更新されたデータではなく古いデータになります。 –
@Clausen:最新の回答をご覧ください。 –