为什么底部打印不正常?

时间:2018-05-22 00:19:31

标签: python

第一次,我正在努力开始我的软件开发&编程证书通过伯克利扩展计划,我的叔叔帮助我获得了一些编程书籍,以便在我正式注册和开始之前获得一些启发。

我决定扩展本书中提供的一个示例,看看我是否可以通过不同的路径创建相同的结果。

长话短说,当我按顺序打印注释掉部分的顶行时(0 1 2)。然而,当我运行未注释的第二部分时,它打印0 2 1.希望有人可以澄清为什么对我来说,我的第一个倾向是它与unconfirmed_users.remove(user)有关,尽管这只是来自新手的猜测^ ^;

    unconfirmed_users = [ 'anna', 'bryce', 'carmina',]
confirmed_users = []

#while unconfirmed_users:
    #confirmed_user = unconfirmed_users.pop()
    #print("Confirming user: " + confirmed_user.title())
    #confirmed_users.append(confirmed_user)
#print("\nThe following users have been confirmed: ")
#for users in confirmed_users:
    #print(users.title())


while unconfirmed_users:
    for user in unconfirmed_users:
        print("Confimring User: " + user.title())
        unconfirmed_users.remove(user)
        confirmed_users.append(user)
print("\nThe following users have been confirmed: ")
for users in confirmed_users:
    print(users.title())

3 个答案:

答案 0 :(得分:1)

你正在做的事情似乎很明智,但是Python将你的for循环翻译成这样的东西:

i = 0
while i < len(unconfirmed_users):
    user = unconfirmed_users[i]
    # ...
    unconfirmed_users.remove(user)
    i += 1

在幕后,Python正在读取列表的第一个元素('anna'),然后删除它,然后移动到修改列表的第二个元素 ({{1因为'carmina'已删除,现在'anna'是第一个元素)。你的代码只会打印'bryce''anna',如果不是因为外部过于聪明的'carmina'循环,它会重复这个迭代并获取你跳过第二个的元素通过while循环的时间。

作为旁注,除非你有充分的理由这样做,否则你可能不应该在迭代时修改列表。查看文档中的the definition of the for statement,特别是最后描述这种情况的最后一段。

答案 1 :(得分:0)

list.pop()默认返回并删除列表中的最后一个值,同时你的for循环从头开始迭代。因此,2个版本的代码创建了镜像结果。

答案 2 :(得分:0)

它出现在第一个被注释的代码块中,您使用pop()通过unconfirmed_users进行迭代。 pop()从列表末尾弹出,如unconfirmed_users [-1]。在第二个代码块中的位置使用for循环,该循环从列表的开头开始,如unconfirmed_users [0]。