x
x
両方のコードでグローバルを指します。確かに、両方のコードにはグローバル以外の何物もありません。x
ここにはローカル変数はなく、グローバル変数のみがあります。
最初の例では、のグローバル値x
は2です。これは、リスト内包によって割り当てられた最後の値であるためです。リスト内包表記は、@ wimで説明されているように、変数を囲んでいるスコープにリークします。ここで囲んでいるスコープはグローバルスコープであるため、変数x
はグローバルスコープにリークされ、前に設定した値0が上書きされます。
2番目の例では、リスト内包表記を作成しますが、その値を(グローバル)変数xに割り当てます。これにより、すでにxに含まれていたものがすべて上書きされるため、グローバル変数xの値がリストになります。
どちらの場合も、リスト内の関数の1つ(いずれか1つ!)を呼び出すと、現在の値のが返されますx
。あなたはここでこれを見ることができます:
>>> y = [lambda : x for x in range(3)]
>>> y[0]()
2
>>> x = 88
>>> y[0]()
88
>>> x = [lambda : x for x in range(3)]
>>> y = x
>>> y[0]()
[<function <lambda> at 0x017789B0>,
<function <lambda> at 0x01828DB0>,
<function <lambda> at 0x01828F30>]
>>> x = 88
>>> y[0]()
88