Python嵌套列表矩阵中A[2][:]与A[:][2]输出相同原因咨询
现象原因
Python原生嵌套列表不支持NumPy式的多维度切片逻辑,所有切片操作都是从左到右按顺序逐层作用在当前返回的对象上,不会自动按“行/列”的矩阵维度映射:
- 对语句
print(A[2][:]):执行顺序是先取外层列表A索引为2的元素(也就是从1开始计数的第三行,Python默认索引从0开始),得到子列表[-6, 7, 11, 19],再对这个子列表做全切片[:],返回的就是该子列表的浅拷贝,输出第三行是符合预期的。 - 对语句
print(A[:][2]):第一步的A[:]是对外层列表做全切片,返回的是和原A结构完全一致的整个矩阵的浅拷贝,等价于复制了一份外层的行列表;第二步再对这个拷贝后的外层列表取索引为2的元素,拿到的自然还是第三行的子列表,因此两个语句输出完全相同。
原生列表正确提取列的写法
原生Python没有直接按列切片的语法,要提取指定列需要遍历所有行,逐行取出对应索引的元素:
- 常规循环写法:
# 提取索引为2的列(从1计数的第三列,元素为5、9、11、4) col_3 = [] for row in A: col_3.append(row[2]) print(col_3)
- 更简洁的列表推导式写法:
col_3 = [row[2] for row in A] print(col_3)
注意:
[:, 2]这种直接按列切片的写法,是NumPy数组针对矩阵运算场景专门实现的语法,原生Python列表不支持该特性。
内容的提问来源于stack exchange,提问作者Blackwidow
相关产品推荐
相关产品推荐

