所以我有一段代码从一个大列表中将两个单词放入一个数据库中,然后从列表中删除这两个单词,这样就不再使用了。当列表几乎结束时,它将被传递给一个不相关的函数。
def db_add(words):
for i in words:
choice = randint(2, 9)
if len(words) < choice:
finish(words)
else:
cursor.execute(
'INSERT INTO swaps (word1, word2) VALUES (%s, %s);', (i, words[choice])
)
conn.commit()
words.remove(words[choice])
words.remove(i)
现在,由于无法从列表中删除i
,因此通常会提前失败。使用一些打印语句我发现当i
和words[choice]
以某种方式最终成为相同的单词时发生这种情况。但由于选择从不为0,因此我看不出i
和words[choice]
如何相等。
我唯一的猜测是,它与在for语句中使用时操作列表有关,或者这是我正在犯的一个非常愚蠢的错误,但我真的不知道。
答案 0 :(得分:1)
您正在迭代它时修改列表。这不可避免地导致问题。如果您需要从列表中删除元素,建议您复制列表,从副本中删除单词,然后返回副本。
def db_add(words):
words_copy = words.copy()
for i in words:
choice = randint(2, 9)
if len(words) < choice:
finish(words)
else:
cursor.execute(
'INSERT INTO swaps (word1, word2) VALUES (%s, %s);', (i, words[choice])
)
conn.commit()
words_copy.remove(words_copy[choice])
words_copy.remove(i)