第一次来这里,我正在准备我的软件开发和编程证书。通过伯克利扩展计划,我叔叔帮我买了几本编程书籍,以便在我正式注册和开始之前获得一些先机。
我决定扩展书中提供的一个示例,看看是否可以通过不同的途径创建与他们相同的结果。
长话短说,当我运行注释掉部分的顶行时,它会按顺序打印(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())
最佳答案
你正在做的事情可能看起来很明智,但Python将你的for
循环翻译成这样:
i = 0
while i < len(unconfirmed_users):
user = unconfirmed_users[i]
# ...
unconfirmed_users.remove(user)
i += 1
因此,Python 在幕后读取列表的第一个元素 ('anna'
),然后删除它,然后移动到修改后的列表的第二个元素 ('carmina'
,因为 'anna'
已被删除,现在 'bryce'
是第一个元素)。仅当外部没有过于聪明的 while
循环时,您的代码才会打印 'anna'
和 'carmina'
,它重复此迭代并选取您在 for
循环中第二次跳过的元素。
顺便说一句,您可能不应该在迭代列表时修改列表,除非您有充分的理由这样做。查看the definition of the for
statement在文档中,特别是最后一段准确描述了这种情况。
关于python - 为什么底部打印顺序不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50458131/