2016-07-17 6 views
2

I、次のコードがあります。私はグローバル変数bが変更されているので、外側のループの最初の反復の後と仮定する、今長のstrあるだろPythonの挙動

a = ['bobby', 'freddy', 'jason'] 
b = ['pep', 'lin', 'cat'] 

for a in b: 
    for b in a: 
      print a,b 

を1、反復は停止します。しかしそれはそうしない。

出力:

pep p 
pep e 
pep p 
lin l 
lin i 
lin n 
cat c 
cat a 
cat t 

だから、基本的な質問は、forループを作成したとき、ある、それは反復子のコピーを保存してからも、元の変数であればそのループスルーん、今「ポイント」へ異なる値?

答えて

3

forループが作成されたとき、元の変数が別の値に「ポイントしている」場合でも、イテレータのコピーを格納してループしますか?

はい!あなたはそれを正しく認識しました。通常、このようなループ構造が発生すると、インタプリタはiter(object)を呼び出し、返されたイテレータオブジェクトを繰り返し使用します。元の変数名がこのステップを投稿する他のオブジェクトにバインドされているかどうかは関係ありません。ただ、追加する

0

、次のPythonのコードのように動作するように、forループ制御イテレータプロトコル、と考えることができます:

iterator = iter(collection) 
while True: 
    try: 
     x = next(iterator) 
     # do something 
    except StopIteration as e: 
     break 

したがって、上記のコードは同等です:任意のオブジェクトに対して

for x in collection: 
    # do something 

next組み込み関数は、オブジェクトの__next__「dunder」メソッドを呼び出し、iter呼び出しが__iter__。これらのメソッドをクラスに実装することで、for-loopがカスタムオブジェクトの動作を制御することができます。上記のコードは動作を説明するためだけのものであることに注意してください。実際の実装ではありません。これは、Pythonシリーズを踏襲して、のMatt Herisの中間Pythonプログラミングから取られました。