Python二维数组初始化差异:修改y[0][0]为何所有行对应列都变更?
核心原因:两种初始化的列表元素引用逻辑完全不同
- 对于数组
x:
四次append([0])操作中,每次写[0]都会在内存中创建一个独立的新列表对象,x的四个元素分别指向四个互不相关的内存地址。修改x[0][0]时仅改动第一个元素指向的列表值,不会影响其他元素。 - 对于数组
y:y = [ [0] * 1 ] * 4的执行分为两步:首先生成[ [0] ]这个包含单个列表对象的数组,后续的*4操作是复制了4次该内部列表的引用,而非重新创建4个新列表。也就是说y的四个元素本质是同一个列表的四个别名,全部指向同一个内存地址。
你可以用id()函数验证这个结论:
# 查看y的元素地址,会发现四个值完全一致 print(id(y[0]), id(y[1]), id(y[2]), id(y[3])) # 查看x的元素地址,四个值各不相同 print(id(x[0]), id(x[1]), id(x[2]), id(x[3]))
因此修改y[0][0] = 2时,实际修改的是四个元素共同指向的那一个列表的取值,自然所有行的对应元素都会同步变化,不是触发了什么全局初始化逻辑,只是引用共享的表现而已。
如果要创建元素完全独立的二维数组,推荐使用列表推导式写法:
y = [ [0]*1 for _ in range(4) ]
该写法每次循环都会生成新的列表对象,修改单个元素不会影响其他行。
内容的提问来源于stack exchange,提问作者sradhakrishna
相关产品推荐
相关产品推荐

