欢迎Python的对象引用系统。变量名称与存储器中存储的实际对象之间并没有很深的关系。
假设你有一个朋友lst
,和你聘请了抢劫犯iter
以抢劫他。现在你告诉抢劫者你的朋友是电话簿中的第三个杰克(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