您的位置:首页技术文章
文章详情页

请问python中为什么我用for循环对嵌套列表进行赋值时,都是以i的最终值来计算的?

【字号: 日期:2022-06-29 11:03:17浏览:81作者:猪猪

问题描述

有两个例子,第一个如下,

a=[0]*5for i in range(5): a[0]=i+3

此时,a=[3,4,5,6,7]第二个如下:

a=[[0,0]]*5for i in range(5): a[0]=i+3

这个时候,a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]

为什么会出现这种情况呢,我的第二种写法有什么不对吗?新手求大神指教!

问题解答

回答1:

你这里犯了2个问题: 第一个, 也就是楼上说得, 你一直是修改a[0]的值, 你并没有将变化的i放入列表去处理, 或者说, 你漏了把i写进题目中的代码: 正确方法:

a = [0] * 5for i in range(5): a[i] = i + 3print a

第二个问题, 也就是你上面问得, 为什么a=[[0,0]]*5这种定义方法, 结果出来发现全部都是a=[[7, 0], [7, 0], [7, 0], [7, 0], [7, 0]]这个问题和第一个问题有个相同之处, 就是你应该是忘了写a[i][0] = i + 3,其次就是: 如果用[[0, 0]] * 5这样的方式生成的列表, 里面的全部都这是引用, 都是同一个对象, 并不是5个对象! 看例子:

a = [[0, 0]] * 5print aprint id(a[0])print id(a[1])print id(a[2])# 输出[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]424556884245568842455688

可以通过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 + 3print a# 输出[[3, 0], [4, 0], [5, 0], [6, 0], [7, 0]]回答2:

因为你要用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]: aOut[157]: [7, 0, 0, 0, 0]In [159]: a=[0]*5 ...: for i in range(5): ...: a[i]=i+3 ...: ...:In [160]:In [160]: aOut[160]: [3, 4, 5, 6, 7]

第二次代码:

In [163]: a=[[0,0]]*5 ...: for i in range(5): ...: a[0]=i+3 ...:In [164]: aOut[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]: aOut[166]: [3, 4, 5, 6, 7]

好像是你代码写错了,我猜你想问这个问题

In [168]: a=[[0,0]]*5 ...: for i in range(5): ...: a[i][0]=i+3 ...: ...: ...:In [169]: aOut[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 说的是正确的

回答3:

实际上就是第2种方式是共享的,而不是单独形式了。因为此时是列表,是可变的,而第1种方式是数字,是不可变的。

标签: Python 编程