python - 为什么底部打印顺序不正确?

标签 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())

最佳答案

你正在做的事情可能看起来很明智,但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/

相关文章:

python - Pandas 在结构化 ndarray 中保留固定长度的字符字段

python - Python scikit-learn 每次运行后聚类结果的变化

python - 为什么我的并行代码比顺序代码慢

python - 将 'object' 添加到带有到期计时器的堆栈中,并在到期时收到通知

python - 渐变在拥抱脸模块中返回无

python - 使用日期时间键的字典搜索

python - 如何防止数字在图中变为指数形式

python - 在 Python 3 中将两个整数映射为一个整数

python - 为数据框中两列之间的所有日期添加行的快速方法

python - 使用 h5py 压缩现有文件