Python列表赋值疑问:为何单个元素赋值引发两处突变?
问题原因分析
你遇到的问题核心在于Python中列表乘法的引用特性:
- 当执行
[[0] * cols] * rows时,[0] * cols确实会创建一个包含cols个0的列表,但* rows并没有生成rows个独立的新列表,而是把同一个列表对象的引用重复了rows次。也就是说,grid里的每一行其实都指向内存中的同一个列表。 - 所以当你修改
grid[0][1] = 1时,本质是修改了那个被所有行共享的底层列表,自然所有行的第1个索引位置(索引从0开始)都会变成1。
正确的二维列表创建方式
要生成每行独立的二维列表,应该使用列表推导式:
rows = 2 cols = 2 grid = [[0] * cols for _ in range(rows)] grid[0][1] = 1 print(grid) # 输出 [[0, 1], [0, 0]]
这里的for _ in range(rows)会循环rows次,每次都重新执行[0] * cols创建一个新的列表,确保每行都是独立的对象。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

