循环只迭代一次

时间:2018-06-13 19:37:58

标签: python

出于某种原因,尽管列表中有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.

我做错了什么,这里?

1 个答案:

答案 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