Pythonのオブジェクト参照システムへようこそ。変数名は実際にメモリに格納されている実際のオブジェクトと深い関係はありません。
は、あなたが友人lst
があると、あなたは彼をマグ強盗iter
を雇います。今度は、あなたの友人が電話帳の第3のジャック(globals
)であることを強盗に伝えます。
lst = [1, 2, 3]
itr = iter(lst) # iter object now points to the list pointed to by lst
# it doesn't care about its name (doesn't even knows its name actually)
# Now the mugger has found the friend, and knows his address (the actual object in memory).
# The mugger catches him, and takes his jacket.
print itr.next() # outputs 1
# Now the telephone directory was updated (yes it's updated very frequently).
lst1 = lst # your friend is now the fourth Jack
lst = ['a', 'b', 'c'] # someone else is the third Jack now
# but mugger doesn't know, he won't see the directory again
print itr.next() # (output 2), mugger takes t-shirt, and leaves him for now
# Meanwhile your friend buys new clothes.
lst1.append(4) # here the actual object pointed to by iter is updated
lst1.append(5)
# You call the mugger and say, don't leave him until he's got nothing.
# The mugger goes full retard.
for i in iter:
print i # outputs 3, 4 and 5
NTL; DR:Pythonの変数名はスペースでいくつかのオブジェクトを参照するだけでタグです。 lst
という名前のlist
のiter
を呼び出すと、イテレータオブジェクトの種類は実際のオブジェクトへのポインタを取得しますが、現在の名前はlst
でもありません。
あなたがappend
、extend
、pop
、remove
などを呼び出すことによって、元のオブジェクトを変更することができた場合は、イテレータの動作が影響を受けることになります。しかし、新しい値をlst
に割り当てると、新しいオブジェクトが作成されます(それが以前に存在しなかった場合)。lst
は、単にその新しいオブジェクトを指し始めるだけです。
ガベージコレクタは、他のオブジェクトが指していない場合は元のオブジェクトを削除します(この場合はitr
が指し示しているため、元のオブジェクトはまだ削除されません)。
http://foobarnbaz.com/2012/07/08/understanding-python-variables/
エクストラ:これは、オブジェクト参照とは何の関係もありません
# The friend goes and buys more clothes.
lst1.extend([6, 7, 8])
# You call the mugger and ask him to take a shot at the friend again.
itr.next() # But the mugger says, chill man he's got nothing now
# raises StopIteration
、イテレータはちょうどそれが完全なリストを反復していることを内部的に格納します。
あなたはリストを変更していないので、まったく関係のない新しいものを作成しました。 – jonrsharpe