有两个例子,第一个如下,
a=[0]*5
for i in range(5):
a[0]=i+3
此时,a=[3,4,5,6,7]
第二个如下:
a=[[0,0]]*5
for i in range(5):
a[0]=i+3
这个时候,a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
为什么会出现这种情况呢,我的第二种写法有什么不对吗?
新手求大神指教!
大家讲道理2017-06-12 09:27:09
你这里犯了2个问题:
第一个, 也就是楼上说得, 你一直是修改a[0]的值, 你并没有将变化的i
放入列表去处理, 或者说, 你漏了把i
写进题目中的代码:
正确方法:
a = [0] * 5
for i in range(5):
a[i] = i + 3
print a
第二个问题, 也就是你上面问得, 为什么a=[[0,0]]*5
这种定义方法, 结果出来发现全部都是a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
a=[[0,0]]*5
这种定义方法, 结果出来发现全部都是a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
这个问题和第一个问题有个相同之处, 就是你应该是忘了写a[i][0] = i + 3
,
其次就是: 如果用[[0, 0]] * 5
这个问题和第一个问题有个相同之处, 就是你应该是忘了写a[i][0] = i + 3
,
[[0, 0]] * 5
这样的方式生成的列表, 里面的全部都这是引用, 都是同一个对象, 并不是5个对象! 看例子:
a = [[0, 0]] * 5
print a
print id(a[0])
print id(a[1])
print id(a[2])
# 输出
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
42455688
42455688
42455688
id
值看到, 他们都是一样的地址, 所以列表中的5个对象, 全是同一个, 所以当你执行a[i][0]= i+3
可以通过a = [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], ]
for i in range(5):
a[i][0] = i + 3
print a
# 输出
[[3, 0], [4, 0], [5, 0], [6, 0], [7, 0]]
漂亮男人2017-06-12 09:27:09
因为你要用i 变量进行迭代,你总是改变0的话,a[0] 当然被覆盖了,为最后一次的值
第一次代码,也得不出a=[3,4,5,6,7],你得用i变量
In [156]: a=[0]*5
...: for i in range(5):
...: a[0]=i+3
...:
In [157]: a
Out[157]: [7, 0, 0, 0, 0]
In [159]: a=[0]*5
...: for i in range(5):
...: a[i]=i+3
...:
...:
In [160]:
In [160]: a
Out[160]: [3, 4, 5, 6, 7]
第二次代码:
In [163]: a=[[0,0]]*5
...: for i in range(5):
...: a[0]=i+3
...:
In [164]: a
Out[164]: [7, [0, 0], [0, 0], [0, 0], [0, 0]]
In [165]: a=[[0,0]]*5
...: for i in range(5):
...: a[i]=i+3
...:
...:
In [166]: a
Out[166]: [3, 4, 5, 6, 7]
好像是你代码写错了,我猜你想问这个问题
In [168]: a=[[0,0]]*5
...: for i in range(5):
...: a[i][0]=i+3
...:
...:
...:
In [169]: a
Out[169]: [[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]
你可以把a打印出来
In [175]: a=[[0,0]]*5
...: for i in range(5):
...: a[i][0]=i+3
...: print(a,id(a[i]))
...:
[[3, 0], [3, 0], [3, 0], [3, 0], [3, 0]] 93411808
[[4, 0], [4, 0], [4, 0], [4, 0], [4, 0]] 93411808
[[5, 0], [5, 0], [5, 0], [5, 0], [5, 0]] 93411808
[[6, 0], [6, 0], [6, 0], [6, 0], [6, 0]] 93411808
[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]] 93411808
@Lin_R 说的是正确的