Python拆分元组列表时出现异常行为的原因探究
问题原因解析
你的代码失效的核心问题出在这一行:
arr = [[]]*2
这行代码不是创建两个独立的空列表,而是创建了一个包含两个指向同一个空列表对象的引用的列表。也就是说,arr[0]和arr[1]在内存中指向的是同一个列表,不管你往arr[0]还是arr[1]里添加元素,本质上都是在操作同一个底层列表。所以最后打印时,两个子列表显示的内容完全相同——因为它们本来就是同一个东西。
你可以用id()函数验证这一点:
data = [(0,1),(0,2),(1,1),(1,2),(1,3)] arr = [[]]*2 print(id(arr[0]), id(arr[1])) # 输出两个相同的内存地址
修复方法
把创建arr的代码改成以下两种方式之一,就能生成两个独立的空列表:
- 直接显式创建两个空列表:
arr = [[], []]
- 使用列表推导式(更适合子列表数量较多的场景):
arr = [[] for _ in range(2)]
修改后再运行你的循环代码,就能得到预期的结果:
[[(0, 1), (0, 2)], [(1, 1), (1, 2), (1, 3)]]
内容的提问来源于stack exchange,提问作者seamus
相关产品推荐
相关产品推荐

