Python列表append/extend使用后循环引用致索引异常问题问询
为什么列表索引会返回自身?循环引用的锅!
嘿,这个问题其实是Python列表的引用特性和循环引用在搞事情,我一步步给你理清楚:
先复盘你的操作逻辑
初始化两个列表:
marxes = ['Groucho', 'Chico', 'Harpo', 'Zeppo'] others = ['Gummo', 'Karl']执行
marxes.append(others):append()方法会把传入的对象作为单个元素添加到列表末尾。这里的关键点是:marxes最后新增的元素,不是others的副本,而是指向others列表本身的引用。所以此时marxes变成:['Groucho', 'Chico', 'Harpo', 'Zeppo', ['Gummo', 'Karl']](注意最后那个元素和
others是同一个对象)执行
others.extend(marxes):extend()会把传入的可迭代对象(这里是marxes)的每一个元素依次添加到others末尾。而marxes的最后一个元素是啥?就是others自己的引用啊!
这就导致others在扩展时,把自己也加进了自身的末尾——形成了循环引用:others包含了对自己的引用。
为什么索引会返回整个列表?
- 当Python检测到列表存在循环引用时,打印列表会用
[...]来代替无限递归的内容,避免程序卡死。所以你看到的others是:['Gummo', 'Karl', 'Groucho', 'Chico', 'Harpo', 'Zeppo', [...]] - 而
others[-1]这个元素,本质上就是others自己的引用。你可以用is运算符验证:
所以不管你怎么多层索引(比如print(others[-1] is others) # 输出True,说明是同一个对象others[-1][-1][-1]),拿到的始终是others本身。
总结一下
append()是添加整个对象作为单个元素,extend()是拆分对象的元素逐个添加- Python列表是引用类型,当操作导致列表包含自身引用时,就会形成循环引用,表现为打印时的
[...],索引时返回列表自身
内容的提问来源于stack exchange,提问作者Chandan
相关产品推荐
相关产品推荐

