这是因为您在这个函数中传递的列表将1作为第一个元素的值。例如:out([1,2,3,4]) # ==> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
一步一步地检查代码:
^{pr2}$
for i in some_list:
for循环值i是您在some_list中所处元素的值,它不是我们在列表中所处元素的索引或位置(,因为这个问题似乎有意)if i == 1:
test_list = [0,0,0,0]
如果值是1,那么test_list将被设置为[0,0,0,0]。一旦命中,则只有值[0,0,0,0]将被追加到result。因此,如果第一个元素是1,那么在结果中您将只看到值[0,0,0,0],否则您将看到{},直到循环到达列表some_list中的值是1。在
以下是一些示例:out([0,1,2,3]) # [[1, 2, 3, 4], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
out([1,2,3,4]) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
out([2,2,5,1]) # [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [0, 0, 0, 0]]
希望这能让你更清楚为什么你会得到这样的结果。在
编辑
根据您更新的问题,这里发生的是,当您调用.append(fig)时,它只是对内存中fig的引用的副本。基本上,每当它更改时,您附加的所有副本也将更改。有两种方法可以处理这个问题,第一种是在循环的作用域中定义变量fig,这样每个循环上都是一个新的不同的变量:for i in test_list:
fig = [2, 1] # <== In the scope of the loop, so each fig is it's on variable
...
第二种方法是追加fig[:],这意味着它将把数组fig复制为一个新数组,并将其传递给append:for i in test_list:
if i == '0':
fig[0] = off
fig[1] = off
elif i == '1':
fig[0] = off
fig[1] = on
new_list.append(fig[:]) # <== Copy the array fig and append that value