誰かがPythonでこれらの2つの表記法を明確にしてください:
[ [] ] * n
: 明らかに、これは同じオブジェクトへの n 個の参照を作成します (この場合、空のリスト)。これはどのような状況で役立ちますか?(i,)
: この「末尾のコンマ」表記を使用する人を見てきました (例:関数の定義で{0, 1, 2, ... n-1} のすべてのサイズ k 個のサブセットを生成sets
する)。どういう意味ですか?
誰かがPythonでこれらの2つの表記法を明確にしてください:
[ [] ] * n
: 明らかに、これは同じオブジェクトへの n 個の参照を作成します (この場合、空のリスト)。これはどのような状況で役立ちますか?(i,)
: この「末尾のコンマ」表記を使用する人を見てきました (例:関数の定義で{0, 1, 2, ... n-1} のすべてのサイズ k 個のサブセットを生成sets
する)。どういう意味ですか?はい、それは同じオブジェクトへの参照を作成します:
>>> L = [[]] * 3
>>> L
[[], [], []]
>>> L[0].append(1)
>>> L
[[1], [1], [1]]
>>> map(id, L)
[4299803320, 4299803320, 4299803320]
これは、同じアイテムでオブジェクトを作成する場合に便利です。
(i,)
item でタプルを作成しますi
:
>>> mytuple = (5,)
>>> print mytuple
(5,)
>>> print type(mytuple)
<type 'tuple'>
コンマが必要な理由は、そうしないと整数として扱われるためです。
>>> mytuple = (5)
>>> print mytuple
5
>>> print type(mytuple)
<type 'int'>
[ [] ] * n
n
同じ空のリスト オブジェクトへの参照を作成します。通常、リストの 1 つで破壊的な操作を使用することn
になり、それが外側のリストの「すべて」の要素に適用されると驚くため、これはほとんど常にバグです。
ただし、同じ整数ゼロのオブジェクトへの参照を[0] * n
作成します。n
このような式は、カウンターのリストを初期化するのに便利です (おそらく、リスト内の個々のスロットを置き換えます)。整数は不変であるため、ゼロの「すべて」を誤って変更する危険はありません。同じことが、他の「完全に不変」なタイプにも当てはまります (必ずしもタプルとは限りません。タプル自体は不変ですが、可変値を含むことができるからです)。
したがって、この「リスト乗算」操作は役に立たないわけではありません。ただし、保証された不変値のリストを複製するという特定のケースを除いて、それを避けることをお勧めします。変更可能な値のリストを乗算することは安全に使用できますが、それは非常に壊れやすく、バグの根本原因であることが多いため、それがあなたが意図していることであっても、少し冗長な方法で行う方がよいでしょう。明らかにあなたは本当にそれを意味します.
に関しては(i,)
、Python では、リスト、辞書、タプル、およびセット リテラルで「追加の」コンマを使用できます。たとえば、次はすべて有効です。
(1, 2, 3,)
[1, 2, 3,]
{1: 'one', 2: 'two', 3: 'three',}
{1, 2, 3,}
これは、末尾のコンマを省略した場合と何ら変わりはありません。単にオプションの追加として許可されているだけです。
に戻る(i,)
。これは、末尾にコンマが付いた 1 つの項目のタプルです。しかし、落とし穴があります。項目が 1 つしかないタプルの特殊なケースでは、末尾のコンマはオプションではなく、必須です。これは、「1 つのタプル」がそうでなければ と書かれるためですが、その構文形式は、括弧を使用して部分式をグループ化するために既に採用されているためです (たとえば、 がorを生成するはずだった(i)
かどうかを、そうでなければ判断できませんでした)。(1 + 1) * 2
4
(2, 2)
余談ですが、長いタプル/リスト/辞書/セットを複数の行に分割する場合、オプションの末尾のコンマを使用する理由がより明白になることがあります。
foo = [
'this',
'is',
'a',
'long',
'list',
]
このスタイルで書くと、ソース コードの行を並べ替えるだけでリストを並べ替えることができます。再注文したアイテムの 1 つがリストの最後のアイテムであった場合、コンマをクリーンアップする必要はありません。
同様に、バージョン管理を使用している場合、最後のアイテムの後にアイテムを追加しても、前の最後のアイテムの行は変更されないため、差分は純粋な追加です。最後の行にカンマがなかった場合は、項目を追加するためにコンマを追加する必要があります。これにより、変更がその行への編集として記録され、マージの競合が (わずかに) 起こりやすくなり、履歴ログが (わずかに) 難しくなります。読んだ。
[...] * n
mustの最も一般的な用途は、ハタのレシピです。
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
[[]] * n は、同じ可変リストへの参照を作成します。多くの場合、これは必要ではなく、代わりに個別に変更できる一意のリスト オブジェクトが必要です。これを行うには、これを使用できます。
list_of_lists = [[] for i in xrange(n)]