2017-10-17 12 views
0

私は、これは1行に複数の値を割り当てるための方法ではありません知っているが、私はちょうど第四行はここでやっているかを理解しようとしています:ない十分な値

a = input("blah blah") 
b = input("blah blah blah") 
c = input("blaaah") 
A=a,B=b,C=c 
print(A,B,C) 

a,bcがまたはfloatの場合は、"int/float object is not iterable"というエラーが表示されます。

a場合は、bcは文字列であるとa="ab"b="cd"c="ef"を言って、プリントが表示されます:

ef f f 

を文字列が長さ!= 2のであれば、それは"not enough/too many values to unpack"エラーを示しています。

誰かが何が起こっているのか説明できますか?あなたが起こっている正確に何を見るために解体を見てみることができ

答えて

1

A=a,B=b,C=c 

があると評価実際です:

from dis import dis 
dis('A=a,B=b,C=c') 
    1   0 LOAD_NAME    0 (c) 
       2 DUP_TOP 
       4 STORE_NAME    1 (A) 
       6 DUP_TOP 
       8 UNPACK_SEQUENCE   2 
      10 STORE_NAME    2 (a) 
      12 STORE_NAME    3 (B) 
      14 UNPACK_SEQUENCE   2 
      16 STORE_NAME    4 (b) 
      18 STORE_NAME    5 (C) 
      20 LOAD_CONST    0 (None) 
      22 RETURN_VALUE 

これが何を言っていることはチェインの割り当てということです:

A = c 
a, B = c 
b, C = c 

これは、 e値がabの場合は、'e'と等しいことがわかります。

cabはここに何の役割も果たしていない)場合、これは、理由もあるが> 2 unpackingsが失敗する長さの文字列です。

+0

'A'と 'B'が何の役割を持っていないことが正しくありません。 'A = 4、B =" aa "'を試してみると、SyntaxError:literalに代入できません。 'A'の値を取得しようとすると' NameError:name 'A'定義されていません ' – nutmeg64

+0

@ nutmeg64もう一度これをやりましょう。何が起こるのか 'A = 'aa''が試みられ、' 4、B =' aa''を実行しようとする試みが行われます。これは一回のステップで実行されるので、 'SyntaxError'は代入全体を防ぎ、' A'は代入されず、 'NameError'を取得するので、すべてが失敗します。 'a = 1;を試してください。 b = 3; A = a、b = 'ef' 'と出力を参照してください。 –

+0

それは正しいです。したがって、以下のコードスニペットは「実際に評価されています:」という誤りは正しくありません。あなたはそこに他の任務が__before__起こっていることを暗示します。 – nutmeg64

1

解説: 私の答えは「Pythonインタープリタのしくみ」については説明していません。私の答えに描かれている一連の出来事は、初心者プログラマーがそれをより良く理解するのを助ける状況を単なる単純化したものです。

A = (a, B) = (b, C) = c 

インタプリタがそれを見てどのようにされているとします。ここでは何が起こっている

はこれです。

これは複数の代入文です。

インタープリタは、2つの引数の繰り返しとしてcを解凍しようとします。 次に、最初の引数をbに、2番目の引数をCに割り当てようとします。

は、次のステップで(b, C)をアンパックおよびa = bB = Cとして割り当てられている 2つの引数の割り当てをタプルする簡単な タプルがあります。

最後のステップでは、2つの引数を含む タプル iterableをアンパックしてAに割り当てる必要があります。ここではAが新しい変数であるため、タプルは展開されず、 タプル Aに反復可能に割り当てます。例えば

>>> c = (1, 'one') 
>>> A = a, B = b, C = c 
>>> A 
(1, 'one') 
>>> B 
'one' 
>>> C 
'one' 
>>> a 
1 
>>> b 
1 
>>> c 
(1, 'one') 
+0

Um、no。これは何が起こるかではなく、私は自分の答えに逆アセンブルを追加しました。これは通訳が実際に行っていることを示しています。あなたの主張が正しければ、 'c'が' 'ef''で、' 'ef''ではない' '(' e '、 'f')と等しくなります。 –

+0

@JimFasarakisHilliardが編集しました。小さな事に抱かれないでください;) – nutmeg64

+0

再び、これは間違っています。複数の課題には非常に明確なステップがあり、それを虚偽表現しています。 –

関連する問題