Python数组定义内部原理:两种初始化方式为何结果不同?
为什么Python中两种列表初始化方式修改后结果不同?
你的猜测完全正确,这确实是Python中对象引用的特性导致的,下面具体拆解两种写法的差异:
1. l_1 = [[0]] * 10 的本质
当使用*操作符复制列表时,复制的是原列表内元素的引用,而非创建全新的独立对象。这里的[[0]]是一个包含单个列表的外层列表,*10会把这个内部[0]列表的引用重复10次,塞进新的外层列表里。
换句话说,l_1里的10个元素其实全是指向同一个[0]列表的指针。当你执行l_1[2][0] += 1时,你修改的是那个被所有元素共享的内部列表,所以所有位置的元素都会同步变成[1]。
2. l_2 = [[0] for _ in range(10)] 的本质
列表推导式会在循环的每一次迭代中,重新执行[0]的创建逻辑——也就是每次循环都会生成一个全新的、独立的[0]列表对象。
所以l_2里的10个元素是10个完全分开的列表,它们各自拥有独立的内存地址,互相之间没有关联。当你修改l_2[2][0]时,只会影响第3个位置的那个列表,其他位置的列表不受任何影响,因此只有l_2[2]变成[1]。
验证内存地址的差异
你可以用id()函数直观看到两种写法的内存差异:
print(id(l_1[0]), id(l_1[1])) # 输出两个相同的内存地址,说明是同一个对象 print(id(l_2[0]), id(l_2[1])) # 输出两个不同的内存地址,说明是独立对象
内容的提问来源于stack exchange,提问作者user22244332
相关产品推荐
相关产品推荐

