Python中for循环append列表重复最后元素的原因解析
问题根源与解决原理
为什么直接append列表会导致所有元素都是最后一次的结果?
Python里的列表是可变对象,当你执行combinations.append(wordlist_copy)时,并没有把当前wordlist_copy的内容复制一份存进去,而是把这个列表在内存中的引用地址添加到了combinations里。
也就是说,combinations里的所有元素其实都指向同一个列表对象——就是你一开始创建的wordlist_copy。后续循环中每次修改wordlist_copy的内容,所有已经存在于combinations里的"元素"(本质是引用)都会同步反映这个修改。直到循环结束,wordlist_copy被改成了最后一次的状态['a','a'],所以combinations里的所有引用指向的都是这个最终状态,自然全是['a','a']。
为什么list(wordlist_copy)能解决问题?
list(wordlist_copy)的作用是创建一个全新的列表对象,并把原wordlist_copy中的所有元素复制到这个新列表里。
每次执行combinations.append(list(wordlist_copy))时,添加到combinations里的是这个新创建的列表的引用,而不是原wordlist_copy的引用。这些新列表和原wordlist_copy是互相独立的内存对象,后续修改原wordlist_copy时,已经添加到combinations里的新列表不会受到任何影响,因此能保留每次循环时的状态,最终得到你预期的结果。
关键代码对比
原代码片段:
combinations.append(wordlist_copy)
修改后代码片段:
combinations.append(list(wordlist_copy))
内容的提问来源于stack exchange,提问作者user25001766
相关产品推荐
相关产品推荐

