为什么未主动修改变量,Python中的变量却自动发生了变更?
根本原因
这是Python中可变对象的引用传递机制导致的:
- 列表属于可变对象,你定义的
one本质是指向对应内存空间的引用。 - 执行
final_data.append(one)的时候,并没有复制one里的实际内容,只是把one指向的内存地址的引用存入了final_data,也就是说final_data里的元素和原one变量指向的是同一块内存空间。
执行过程拆解
- 第一次循环(r=1):
此时one的值为['x'],append后final_data[0]和one指向同一块内存,内容为['x']。 - 第二次循环(r=2):
执行one[0] = two[0]时,直接修改了one指向的内存空间里的内容,把值改成了'y'。因为final_data[0]和one共享内存,所以final_data[0]的内容也同步变成了['y']。之后再次appendone,相当于又往final_data里加了一个指向同一块内存的引用,最终两个元素的内容都是修改后的['y']。
解决方法
如果要实现你预期的[['x'], ['y']]效果,append时存入one的独立副本即可,避免和原变量共享内存,修改方式如下:
one = ['x'] two = ['y'] final_data = [] for r in range(1, 3): print(final_data, r) if r == 2: one[0] = two[0] print(one) # 改这里,用copy()方法创建副本,用one[:]切片也可以实现相同效果 final_data.append(one.copy()) print(final_data) print(final_data)
运行后就会输出你预期的结果。
内容的提问来源于stack exchange,提问作者Srinivas Piccalo
相关产品推荐
相关产品推荐

