迭代生成嵌套列表时inner_list未被覆盖的原因探究
为什么循环内的
inner_list = []不会覆盖已添加到outer_list的列表? 首先先贴出你的代码:
my_list = ['abc', 'def'] outer_list = [] for element in my_list: inner_list = [] for ch in element: inner_list.append(ch) outer_list.append(inner_list) print(outer_list) # output [['a', 'b', 'c'], ['d', 'e', 'f']]
你的问题是:
上述代码运行后输出结果为
[['a', 'b', 'c'], ['d', 'e', 'f']],请问该代码为何能正常运行?即循环内的inner_list = []语句为何不会覆盖之前的inner_list实例?我推测这与outer_list的作用域处于for循环外部有关,或许当inner_list被添加到outer_list后就与变量名解绑了?这个思路是否正确?
嘿,你的思路方向完全没问题!咱们把这个逻辑拆解得更直白一点:
首先得搞懂Python里变量和对象的本质区别:变量其实就是个"名字标签",它本身不存数据,只是指向内存里的某个实际对象(比如列表这种容器)。当你写inner_list = []的时候,其实是做了两件事:
- 在内存里新建一个全新的空列表对象;
- 把
inner_list这个标签贴到这个新对象上。
回到你的代码流程里:
- 第一次循环时,
inner_list指向第一个空列表,我们往里面塞了a、b、c,然后把这个列表对象添加到outer_list里——注意!outer_list存的不是inner_list这个变量名,而是它指向的那个实实在在的列表对象。 - 第二次循环执行
inner_list = []时,只是创建了另一个新的空列表,把inner_list标签从之前的['a','b','c']上撕下来,贴到新对象上而已。但之前的那个列表根本没消失,因为outer_list还"攥着"它的引用,它安安稳稳待在内存里呢。
所以根本不存在"覆盖之前的inner_list实例"这回事,每次循环的inner_list指向的都是完全不同的对象,outer_list保存的是每个循环里的对象本身,和变量名没关系。
你说的"添加到outer_list后就与变量名解绑",换个更准确的说法是:变量名和对象是完全分离的,outer_list存的是对象的引用,就算变量名转头指向了新对象,旧对象只要还有被引用(比如outer_list里的元素),就不会被回收,自然也不会被覆盖。
举个极简例子帮你加深理解:
x = [1,2] y = x # y和x指向同一个列表 x = [3,4] # x换了个新列表,但y还死死盯着原来的[1,2] print(y) # 输出[1,2]
这和你的代码逻辑一模一样,outer_list就像这里的y,它保存的是对象的引用,变量指向新对象完全不影响已经存好的内容。
内容的提问来源于stack exchange,提问作者Patrick Dennis
相关产品推荐
相关产品推荐

