2

Pythonの変数のスコープについて混乱しています。これが私がやろうとしていることのおもちゃの例です:

a = True
enumerated_set = enumerate(['tic','tac','toe'])
for i,j in enumerated_set:
    if a == True:
        print j

私が得る結果は次のとおりです。

tic
tac
toe

今、

print a

戻り値

`True`

そしてまた走ったら

for i,j in enumerated_set:
    if a == True:
        print j

出力がありません。

私は混乱しています...グローバルにa = True、なぜ2番目のループ中に印刷が実行されなかったのですか。

私はあなたの助けに感謝します。

編集:私が混乱している別の例

y = 'I like this weather'.split()
for item in y:
    for i,j in enumerated_set:
         if a == True: 
             print j

また、出力は生成されません。

4

3 に答える 3

7

実際にはブール値の問題ではありません。それは常にTrueです。

enumerated_setジェネレーターです。あなたがそれを一周すると、それは使い果たされます。新しいものを作成する必要があります。

In [9]: enumerated_set = enumerate(['tic','tac','toe'])

In [10]: enumerated_set.next()
Out[10]: (0, 'tic')

In [11]: enumerated_set.next()
Out[11]: (1, 'tac')

In [12]: enumerated_set.next()
Out[12]: (2, 'toe')

In [13]: enumerated_set.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
/usr/local/<ipython-input-13-7b0a413e4250> in <module>()
----> 1 enumerated_set.next()

StopIteration: 
于 2012-11-08T23:49:41.027 に答える
1

これはスコープによるものではなく、 リストではなくgeneratorenumerateを作成するの性質によるものです。ジェネレーターは使い捨てです。要素を順番にポップオフし、再度評価できるリストを作成しません。これにより、メモリが節約されます。

enumerated_set を 2 回繰り返したい場合は、次のようにします。

enumerated_set = list(enumerate(['tic','tac','toe']))

于 2012-11-08T23:51:59.490 に答える
1

a変数とは関係ありません。列挙子オブジェクトを使用していますが、最初のループで最後まで行きました。2 番目のループ用に再作成する必要があります。

于 2012-11-08T23:52:47.577 に答える