Es gibt zwei Beispiele, das erste lautet wie folgt:
a=[0]*5
for i in range(5):
a[0]=i+3
Zu diesem Zeitpunkt ist a=[3,4,5,6,7]
Der zweite lautet wie folgt:
a=[[0,0]]*5
for i in range(5):
a[0]=i+3
Zu diesem Zeitpunkt ist a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
Warum passiert das? Stimmt etwas mit meiner zweiten Schreibweise nicht?
Neulinge, bitte gebt mir einen Rat!
你这里犯了2个问题:
第一个, 也就是楼上说得, 你一直是修改a[0]的值, 你并没有将变化的
i
放入列表去处理, 或者说, 你漏了把i
写进题目中的代码:正确方法:
第二个问题, 也就是你上面问得, 为什么
a=[[0,0]]*5
这种定义方法, 结果出来发现全部都是a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
这个问题和第一个问题有个相同之处, 就是你应该是忘了写
a[i][0] = i + 3
,其次就是: 如果用
[[0, 0]] * 5
这样的方式生成的列表, 里面的全部都这是引用, 都是同一个对象, 并不是5个对象! 看例子:可以通过
id
值看到, 他们都是一样的地址, 所以列表中的5个对象, 全是同一个, 所以当你执行a[i][0]= i+3
时, 不管你修改第几个元素, 最终都只是修改同一个列表而已!所以如果想试下你想要的效果, 你就不能用那种方式快速生成列表,只能用下面的方法:
因为你要用i 变量进行迭代,你总是改变0的话,a[0] 当然被覆盖了,为最后一次的值
第一次代码,也得不出a=[3,4,5,6,7],你得用i变量
第二次代码:
好像是你代码写错了,我猜你想问这个问题
你可以把a打印出来
@Lin_R 说的是正确的
实际上就是第2种方式是共享的,而不是单独形式了。因为此时是列表,是可变的,而第1种方式是数字,是不可变的。