Python创建零矩阵[[0]*6]*3写法问题及列表相等性判断疑问
Python 嵌套列表相等性与内存结构相关问题解答
1. == 运算符的判定逻辑
Python 中内置容器类型(包括列表、元组、字典等)的==运算默认只做值语义的递归比较,和内存存储结构无关:
- 只要两个列表的长度相同,且每个对应位置的元素递归比较结果都相等,
==就会返回True - 你提到的两类矩阵可以用代码直观展示:
两类矩阵在元素未被修改前,递归比较每个位置的值都是0,自然# 错误创建方式,三行共享同一个列表对象 mat1 = [[0]*6]*3 # 正确创建方式,三行是独立的列表对象 mat2 = [[0]*6 for _ in range(3)]mat1 == mat2返回True。你可以测试修改mat1[0][0] = 1,会发现三行的第一个元素都变成1,这时候再和mat2比较,==就会返回False。 ==的设计逻辑就是只校验数据值是否匹配,不需要内存结构相同,这是Python官方定义的语法规则。
2. 校验列表内存结构是否一致的方法
如果需要判断列表的内存存储结构是否独立,有两种常用实现方式:
- 用
id()函数递归检查每个子元素的内存地址,示例代码如下:# 检查矩阵是否存在行共享的情况 def has_shared_subarray(matrix): return len(set(id(row) for row in matrix)) == 1 # 校验两个嵌套列表的内存结构是否完全独立 def compare_memory_structure(m1, m2): if len(m1) != len(m2): return False for r1, r2 in zip(m1, m2): # 子列表地址相同说明共享内存 if id(r1) == id(r2): return False # 若有更深层嵌套,可递归调用该函数继续检查 return True - 用
is运算符做身份比较:a is b会直接判断两个变量是否指向内存中的同一个对象,和==仅校验值的逻辑完全独立。比如mat1[0] is mat1[1]会返回True,mat2[0] is mat2[1]会返回False。
3. 和其他编程语言差异的原因
你之前使用的Pascal、SAS宏语言的数组默认是值语义分配,声明嵌套数组时会自动为每个子数组开辟独立内存,自然不会出现这类问题。Python的列表本质是引用数组,存储的不是实际值而是指向每个元素对象的指针,[x]*n操作只是把x的指针复制了n次,不会生成新的x对象,才会出现多行行共享同一子列表的情况。
相关知识查阅渠道
你可以直接查阅Python官方文档中以下部分的内容:
- 内置类型的比较运算规则
- 序列类型(列表)的乘法操作实现逻辑
is和==的区别说明
内容的提问来源于stack exchange,提问作者JBRIII
相关产品推荐
相关产品推荐

