Python中两种二维列表初始化方式的差异咨询
两种二维列表初始化方式的核心区别
方式1:嵌套列表推导式
temp = [[-1 for y in range(k + 1)] for x in range(n + 1)]
- 外层列表推导式的每一次迭代,都会生成一个全新的内层列表。最终
temp里的每个子列表都是内存中独立的对象,彼此毫无关联。修改任意一个子列表的元素,不会影响其他子列表的内容,这也是它能符合预期的原因。
方式2:多重乘法初始化
temp = [[-1]*(k+1)]*(n + 1)
- 这个操作分两步:首先
[-1]*(k+1)创建出一个内层列表;然后*(n+1)并没有生成新的内层列表,只是把同一个内层列表的引用重复了n+1次,塞进外层列表里。也就是说,temp里的所有子列表本质上指向内存中同一个列表对象。一旦修改任意一个子列表的元素,所有子列表都会同步变化——因为它们本来就是同一个东西,这就是程序行为异常的根源。
举个直观的例子,假设n=2,k=1:
- 方式1创建的
temp是[[-1, -1], [-1, -1], [-1, -1]],三个子列表完全独立; - 方式2创建的
temp看似结构相同,但三个子列表共享同一块内存,修改temp[0][0] = 0后,整个temp会变成[[0, -1], [0, -1], [0, -1]]。
内容的提问来源于stack exchange,提问作者Naveen Pragathesh
相关产品推荐
相关产品推荐

