5

私はPythonが初めてです(Javaを基本として)。Dive Into Pythonの本を読みましたMulti-Variable Assignment。たぶん、あなたの中には、次のコードで何が起こっているのかを理解するのを手伝ってくれる人もいます:

>>> params = {1:'a', 2:'b', 3:'c'}
>>> params.items() # To display list of tuples of the form (key, value).
[(1, 'a'), (2, 'b'), (3, 'c')]

>>> [a for b, a in params.items()] #1
['a', 'b', 'c']
>>> [a for a, a in params.items()] #2
['a', 'b', 'c']
>>> [a for a, b in params.items()] #3
[ 1 ,  2 ,  3 ]
>>> [a for b, b in params.items()] #4
[ 3 ,  3 ,  3 ]

私がこれまでに理解しているのは#1#2タプルの値を表示する同じ出力です。#3タプルのキーを表示し、#4タプルのリストから最後のキーだけを表示します。

上記のすべてのケースでの変数aと変数の使用法がわかりません:b

  1. a for b, a ...-> 値を表示
  2. a for a, a ...-> 値を表示
  3. a for a, b ...-> キーを表示
  4. a for b, b ...-> 最後のキーを表示

上記のすべてのケースのループの流れを詳しく説明できる人はいますか?

4

3 に答える 3

8

そこで使用するリスト内包表記は、大まかに次のように変換されます。

[a for b, a in params.items()]

になる

result = []
for item in params.items():
    b = item[0]
    a = item[1]
    result.append(a)

[a for a, a in params.items()]

になる

result = []
for item in params.items():
    a = item[0]
    a = item[1] # overwrites previous value of a, hence this yields values, 
                # not keys
    result.append(a)

[a for a, b in params.items()]

になる

result = []
for item in params.items():
    a = item[0]
    b = item[1]
    result.append(a)

[a for b, b in params.items()]

になる

result = []
for item in params.items():
    b = item[0]
    b = item[1]
    result.append(a) # note use of a here, which was not assigned

このラストは特別です。前のステートメントで変数aを使用し、それに割り当てられた最後の値が だったためにのみ機能しました3。このステートメントを最初に実行すると、エラーが発生します。

于 2012-08-03T08:07:42.393 に答える
6

4 つのケースすべてで、タプル内の名前は、シーケンスのペア内の各要素に順番にバインドされます。4 番目のインスタンスは、Python 2.x での (誤った) 動作の例です。名前は、LC の外であっても、最後に持っていたオブジェクトにバインドされたままになります。この動作は 3.x で修正されています。

>>> [x for x in (1, 2, 3)]
[1, 2, 3]
>>> x
3

3>> [x for x in (1, 2, 3)]
[1, 2, 3]
3>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
于 2012-08-03T08:05:34.143 に答える
3

タプルは、変数をまとめただけです。電話すると、これらのペアを取得します

params.items()

あなたがコメントで自分自身を書いたように。

タプルをアンパックするには、次のことを行う必要があります。

>>> a, b = (2, 3)
>>> a
2
>>> b
3

リスト内包表記を使用する場合も同じです。

>>> [a for a, b in [(2, 3), (4, 5)]]
[2, 4]

ここで a は、リスト内のすべてのタプルについて、タプルの最初の要素を取り出します。これは、私の短いリストの代わりに params リストを使用する場合の #1 です。

代わりに書くと

>>> [b for a, b in [(2, 3), (4, 5)]]
[3, 5]

2 番目の要素を取得します。これはあなたの#3に対応します。

残りの 2 つはあまり意味がありません。#2では

>>> [a for a, a in [(2, 3), (4, 5)]]
[3, 5]
>>> a,a = (2,3)
>>> a
3

これは、最初に a を最初にしてから、各展開で 2 番目の引数で直接上書きします。これと同じことが単一のタプルでも発生することがわかります。

最後の#4は単に絞っています。a を変数としてまだ使用していない場合、 a then が存在しないため、これは機能しません。

>>> [a for b, b in [(2, 3), (4, 5)]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

これがあなたの質問に答えることを願っています。

于 2012-08-03T08:14:00.843 に答える