|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好,在学习视频,有一个问题我没理解,就是嵌套列表的乘法。
在代码:
A=[[0]*3]*3
A[0][0] is A[0][1]
结果是true
A[1][1] is A[1][2]
结果是true
把所有元素is两两一遍,结果都是true
A[1][1]=2
print(A)
输出是:[[0,2,0], [0,2,0], [0,2,0]].
为什么不是输出[[2,2,2],[2,2,2],[2,2,2]]
在代码:
A=[0]*3
A[0] is A[1]
结果是True
A[0]=3
print(A)
输出结果是【3,1,1】
为什么结果不是【3,3,3】呢
本帖最后由 jackz007 于 2025-3-8 11:34 编辑
关于 Python 的 is 运算符,首先要搞清楚,is 运算符比较的是什么,答案是对象的 id,就是说,当两个被比较对象的 id 值相同的时候,比较结果将是 True,这也意味着被比较的两个对象实际上是同一个对象。
A = [[0] * 3] * 3
将创建一个二维列表 : [[0,0,0],[0,0,0],[0,0,0]]
这个列表有如下特点:
1、A 有 3 个元素,A[0],A[1],A[2],这 3 个元素是通过同一个列表复制而成,所以,这三个元素互为镜像,也就是说,id(A[0])、id(A[1])、id(A[2]) 的值是完全相同的,我们知道,列表属于可变对象,是支持修改的,也就是说,修改列表内容不会造成其 id 值的改变。因此,我们会看到,修改 A[0]、A[1] 、A[2] 中的任何一个,其它两个会同步改变,道理很简单,因为它们本来就是同一个列表,所以,我们会看到:
A[1][1]=2
print(A)
输出是:[[0,2,0], [0,2,0], [0,2,0]]
2、A[0]、A[1]、A[2] 中的元素都是通过同一个常数 0 复制而成,所以,A[0]、A[1]、A[2] 这三个列表中的每一个元素 (0) 的 id 值都相同,因为它们也是同一个对象(0),所以:
A[0][0] is A[0][1]
结果是true
A[1][1] is A[1][2]
结果是true
把所有元素is两两一遍,结果都是true
对于代码 : A = [0] * 3
根据前面的交代,is 操作都是 True,当执行 A[0] = 3 后,A[0] 被重新赋值成为另一个对象,与 A[1]、A[2] 脱离镜像关系,也就是说,重新赋值后,id(A[0]) 会改变,而 id(A[1]) 和 id(A[2]) 依然维持原来的数值,也就是说,赋值操作后,A[1]、A[2] 仍然是同一个对象,会不为所动,依然维持原样;
print(A)
输出是:[3,0,0]
|
|