Python中两种二维数组创建方式的区别是什么?
两种Python二维数组创建方式的核心区别
嘿,这个问题真的戳中了Python新手很容易踩的一个坑!咱们直接拆解这两种写法的本质差异:
1. 问题出在第二种写法:myList = [[None]*column]*row
这种方式看起来简洁,但其实藏着大问题——所有行都是同一个列表的引用!
咱们来拆解一下:
- 首先
[None]*column创建了一个包含column个None的列表; - 然后
*row是把这个列表的引用重复了row次,也就是说,你的myList里的每一行,指向的都是内存中同一个列表对象。
举个实际的例子就懂了:
myList = [[None]*3]*2 print(myList) # 输出: [[None, None, None], [None, None, None]] myList[0][0] = "修改" print(myList) # 输出: [["修改", None, None], ["修改", None, None]]
看到没?改第一行的第一个元素,第二行的对应位置也跟着变了——因为它们根本就是同一个列表!
2. 第一种写法才是正确的:myList = [[None]*column for i in range(row)]
这种用列表推导式的写法,每一行都是独立的新列表。
列表推导式会循环row次,每次循环都会重新执行[None]*column,创建一个全新的列表对象,然后把这些新列表收集起来组成二维数组。
同样用上面的例子测试:
myList = [[None]*3 for i in range(2)] print(myList) # 输出: [[None, None, None], [None, None, None]] myList[0][0] = "修改" print(myList) # 输出: [["修改", None, None], [None, None, None]]
这次只有第一行的元素被修改,第二行完全不受影响,这才是我们想要的二维数组效果。
总结一下核心差异
[[None]*column]*row:复制的是列表引用,所有行共享同一个列表,修改一行会影响所有行;[[None]*column for i in range(row)]:每次循环创建新列表,各行相互独立,修改某一行不会影响其他行。
内容的提问来源于stack exchange,提问作者Anil Yadav
相关产品推荐
相关产品推荐

