2017-11-06 5 views
0

なぜこのリストの理解力が、ネストされたforループと同等であると思ったのとは異なる出力を生成しているのか、私は本当に迷っています。誰も洞察力を発することはできますか?リストの入れ子になっているループとは異なる理解出力がありますか?

リスト内包:以下で

[(n ** 5, m ** 3) for n in range(3) for m in range(5) if m % 2 == 0] 

結果:以下の中

L = [] 
for n in range(3): 
    for m in range(5): 
     if m % 2 == 0: 
      n = n**5 
      m = m**3 
      vals = (n,m) 
      L.append(vals) 
L 

結果:私はループの等価入れ子になっていると信じて何が

[(0, 0), (0, 8), (0, 64), (1, 0), (1, 8), (1, 64), (32, 0), (32, 8), (32, 64)] 

、 :

[(0, 0), 
(0, 8), 
(0, 64), 
(1, 0), 
(1, 8), 
(1, 64), 
(32, 0), 
(33554432, 8), 
(42535295865117307932921825928971026432, 64)] 

2つの出力の違いは何ですか?

答えて

1

あなたのネストされたループでは、内側のループでnを変更したので、リスト内包と同等ではありません。0または1以外の値については

n = n**5 

これは指数関数的にnを向上させます。したがって、外側ループn = 2の最後の反復に対しては、2 ** 5 = 32nに、次に32 ** 5 = 33554432に割り当てます。

は別の名前を使用します。

L = [] 
for n in range(3): 
    for m in range(5): 
     if m % 2 == 0: 
      n_power_5 = n**5 
      m_power_3 = m**3 
      vals = (n_power_5, m_power_3) 
      L.append(vals) 

か、単にすべての中間変数を使用しないでください:

for n in range(3): 
    for m in range(5): 
     if m % 2 == 0: 
      L.append((n**5, m**3)) 
+0

はあなたにマルタインをありがとうございます。同等のネストされたforループが何であるべきか尋ねることができますか?それは私の理解を助けるだろう。 – jsynnott

+0

@jsynnottこれらの別々の割り当てをしないでください。単に 'vals =(n ** 5、m ** 3)'を実行してください。 –

+0

@jsynnott:別の名前を使用してください。 –

関連する問題