第一次,我正在努力开始我的软件开发&编程证书通过伯克利扩展计划,我的叔叔帮助我获得了一些编程书籍,以便在我正式注册和开始之前获得一些启发。
我决定扩展本书中提供的一个示例,看看我是否可以通过不同的路径创建相同的结果。
长话短说,当我按顺序打印注释掉部分的顶行时(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())
答案 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]。