你能告诉我我做错了什么以及如何解决它。
由于
我有一个功能。
def out(some_list):
test_list = [1,2,3,4]
result = []
for i in some_list:
if i == 1:
test_list = [0,0,0,0]
else:
test_list = test_list
result.append(test_list)
return result
如果我们将其打印出来,它将返回:
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
我需要返回
[[0, 0, 0, 0], [1,2,3,4], [1,2,3,4], [1,2,3,4]]
答案 0 :(得分:1)
这是因为您在此函数中传递的列表具有1
作为第一个元素的值。例如:
out([1,2,3,4]) # ==> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
逐步完成您的代码:
test_list = [1,2,3,4]
result = []
for i in some_list: # The value of each element in some_list
if i == 1: # If the value is "1" set test_list: [0,0,0,0]
test_list = [0,0,0,0]
else:
test_list = test_list # Otherwise set test_list to itself (doing nothing)
result.append(test_list)
for i in some_list:
i
的for循环值是您在some_list
中所使用的元素的值,它不是我们在列表中所在元素的索引或位置( as看来这个问题打算)
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]
,否则您将看到[1,2,3,4]
,直到循环到达列表{{1}中的值的位置}是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
答案 1 :(得分:0)
这是因为你设置test_list = [0,0,0,0]
因此,即使在test_list = test_list
中,也会将结果设置为[0,0,0,0]
尝试使用
def out(some_list):
test_list = [1,2,3,4]
result = []
for i in some_list:
if i == 1:
result.append([0,0,0,0])
else:
result.append(test_list)
return result