私はこのリスト内包で混乱していますビット:それはどのような順序でこのPythonリストの理解はどのような順序で実行されますか?
l = [[i * j for j in range(3, 5)] for i in range(3)]
実行されますか?
私はこのリスト内包で混乱していますビット:それはどのような順序でこのPythonリストの理解はどのような順序で実行されますか?
l = [[i * j for j in range(3, 5)] for i in range(3)]
実行されますか?
これは、フォームのかなりバニラリスト内包である:この場合
[expression for var in iterable]
、expression
はちょうど別のリスト内包であることを起こります。したがって、内側の理解度は外側のiterableによって得られた各項目について1回評価されます。
我々はアウト機能にインナー理解を破った場合には、もう少し明確に感じるかもしれない:(うまくいけば、とにかく)
def inner(i):
return [i * j for j in range(3, 5)]
l = [inner(i) for i in range(3)]
は、今、私たちはよりはっきりと見る外側の理解がために一度実行するために、内側理解を引き起こすことそれぞれ「i
」がrange(3)
にあります。
は、それが外部から実行されている想像この場合
[X for i in range(3)]
を、Xは別のリスト内包自体である:。
[i*j for j in range(3,5)]
i
を単一の値にバインドされ、その中。
だから、次のように[[0*3,0*4],[1*3,1*4],[2*3,2*4]]
、または[[0,0],[3,4],[6,8]]
、
に展開されます:
l = [[i * j for j in range(3, 5)] for i in range(3)]
i
は、値0
にとり1
、および2
。 i
の各値について、ネストされたリストの内包が評価され、その結果が、トップレベルのリストに保存された:ここで
[i * j for j in range(3, 5)]
は、j
は値3
と4
になります。各値について、現在値がi
のj
の積が保存されます。 i
の最初の値、すなわち0
については
、これは0
倍j
値であるので、あなたは[0, 0]
を取得します。 i
の第二の値、すなわち1
については
、これは1
倍j
値であるので、あなたは[3, 4]
を取得します。 i
の3番目の値、すなわち2
については
、これは2
倍j
値であるので、あなたは[6, 8]
を取得します。
最終的な結果は、あなたが得るので、これら三つのサブリストで構成されるリストである:
[[0, 0], [3, 4], [6, 8]]
l = [[i * j for j in range(3, 5)] for i in range(3)]
が想像することができますように。
(1) l = [[i * j for j in range(3, 5)] with i = 0] => [[0*3, 0*4]]= [[0,0]]
+(2) l = [[i * j for j in range(3, 5)] with i = 1] =>[[0,0], [3,4]]
+(3) l = [[i * j for j in range(3, 5)] with i = 2] =>[[0,0], [3,4], [6,8]]