2

私は見つけた興味深いサンプルスクリプト(このサイトの最後の例の124行目)を調べていましたが、この行でコンマが何をparticles達成したかを理解するのに苦労しています:

particles, = ax.plot([], [], 'bo', ms=6)

カンマを省略すると、スクリプトでエラーが発生しますが、構文(解凍ステートメントに似ているようです)は私にはあまり意味がなく、次のようなステートメントがあります。

a, = [2,3]

失敗します。これは開梱理論に反対する議論のようです。

任意の洞察をいただければ幸いです。

4

3 に答える 3

7

1タプル(またはその他の長さ1のシーケンス)を解凍する必要があります。例:

>>> a,b = (1,2)
>>> print a
1
>>> print b
2
>>> c, = (3,)
>>> print c
3
>>> d = (4,)
>>> print d
(4,)

cとdの違いに注意してください。

ご了承ください:

a, = (1,2)

右側のiterableに含まれているのと同じ数のアイテムが左側に必要なため、失敗します。Python 3.xは、これをいくらか軽減します。

Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:09:56) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a,*rest = (1,2,3)
>>> a
1
>>> rest
[2, 3]
于 2013-02-27T03:44:24.027 に答える
5

plotどのような呼び出しが返されるかを見てください。あなたの場合、それは1つの要素を持つリストです:

>>> import matplotlib.pyplot as plt
>>> ax = plt.gca()
>>> ax.plot([], [], 'bo', ms=6)
[<matplotlib.lines.Line2D object at 0x353d6d0>]

この場合、実際の Line2D オブジェクトをハンドルする方が便利ですh, = ax.plot(...)

h = ax.plot([], [], 'bo', ms=6)

後者の場合、後で追加の手順が必要になります。

h[0].set_data(...)

複数の線オブジェクトを返す必要がある場合があるため、plot の戻り値は常にリストです。クライアントコードがケースごとに異なる方法で処理する必要がないように、リスト内の単一の行を返す方が理にかなっています。


アンパックが失敗する理由a, = [2,3]は、右側にアンパックするものが 2 つあり、変数が 1 つしかないためです。a,b = [2,3]それを解凍 するために使用する必要があります。

于 2013-02-27T03:51:01.617 に答える
3

教育のために、これを少し長くします。

Python では、タプルは括弧で区切られます (例: (1, 2, 3).

残念ながら、 のような 1 つの要素だけで構成されるタプルは1、単に として指定すると (解析の観点から) あいまいになります。これは、式の途中の括弧内の整数(1)を意味する可能性があるためです。

これを克服するために、 のように、要素の直後に 1 つのコンマが続く 1 つの要素だけを持つタプルを指定できます(1,)。(明確にするために、コンマはそれをタプルにするものであり、かっこではありません。括弧は、あいまいでない場合に省略できます。これは、以下で行うことです)。1これは、次の例に示すように、要素として単一のシングルを含むタプルであることは明らかです。

>>> a = (1)
>>> a
1
>>> b = (1,)
>>> b
(1,)
>>> b[0]
1
>>> c, = b
>>> c
1
>>>

あなたが言及したのは、タプルを「アンパック」する方法、つまり、タプルの特定の要素にアクセスする方法です。b[0]使用した構文に代わる 1 つの方法は、上記の例のmy のように、タプル内の要素を 0 でインデックス付けすることです。

複数の要素を持つタプルの場合、タプルが持つ要素と同じ数の属性を指定するだけで、それらをアンパックできます。

>>> x, y = (1, 2)
>>> x
1
>>> y
2

タプルをアンパックするときに同じ数の要素を使用しないと、例外がスローされます。

>>> z, = (1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> 

解凍理論が「失敗する」理由の「例」では、次のように単純に使用できます。

>>> a, _ = [2, 3]
>>> a
2

そこに注意してください_。これは、「気にしない」という意味で Python で使用される通常の変数です。

補足として、 では、可変型であるlistから、不変型であるtuplea, _ = [2,3]を暗黙的に作成していることに注意してください。(この「暗黙の」変換は概念的なものであることに注意してください。Python インタープリターはバイトコードで命令を生成しない可能性があるためです)。次の属性の微妙な点に注意してください。BUILD_TUPLE

>>> a, b = [2, 3]
>>> a
2
>>> b
3
>>> a, b
(2, 3)
>>> c, d = tuple([2, 3])
>>> c
2
>>> d
3
>>> e = [2, 3]
>>> type(e)
<type 'list'>
>>> type((a, b))
<type 'tuple'>
于 2013-02-27T03:54:29.237 に答える