出于某种原因,尽管列表中有2个条目,但下面的代码块只迭代for循环一次。
def remove_client(self, client):
try:
temp = client.followedby
for i in temp:
print("Begin")
print(i)
print(client.followedby)
i.unfollow_user()
print(client.followedby)
print("Passed")
print("Out of loop.")
except AttributeError:
print("AttributeError")
pass
self.cur_id[client.id] = False
self.clients.remove(client)
被调用函数unfollow_user
:
def unfollow_user(self):
self.send_host_message("Stopped following at {}.".format(time.asctime(time.localtime(time.time()))))
self.following.followedby.remove(self)
self.following = ""
print("end of unfollow user")
根据我的知识,这个应该。它不会抛出任何错误,控制台输出为:
[<server.client_manager.ClientManager.Client object at 0x000001F87C2CCE80>, <server.client_manager.ClientManager.Client object at 0x000001F87C2CCD30>] Begin <server.client_manager.ClientManager.Client object at 0x000001F87C2CCE80> [<server.client_manager.ClientManager.Client object at 0x000001F87C2CCE80>, <server.client_manager.ClientManager.Client object at 0x000001F87C2CCD30>] end of unfollow user [<server.client_manager.ClientManager.Client object at 0x000001F87C2CCD30>] Passed Out of loop.
我做错了什么,这里?
答案 0 :(得分:1)
简而言之,这是您正在做的事情的一个例子。
>>> x = [1,2]
>>> for i in x:
... x.remove(2)
... print("Hello world.")
...
Hello world.
当你在python中使用for循环结构时,你在迭代器上调用next()
。当您在迭代时修改元素时,列表的内置迭代器的行为类似:
当循环修饰序列时有一个微妙之处(这只能发生在可变序列,即列表中)。内部计数器用于跟踪下一个使用的项目,并在每次迭代时递增。当该计数器达到序列的长度时,循环终止。
您正在减少长度,迭代器会检查它。所以它只在1次迭代后退出循环。
如果你想在所有元素中运行它,那么执行一个副本并将其分配给你的temp:
import copy
temp = copy.copy(x)
for i in temp:
# Do whatever you want here