我试图通过传递一个函数列表a来理解列表理解,如下面的代码所示。
def fun1(x):
x.append(5)
print(" In Fun 1:")
print(x)
return x
def fun2(x):
x.append(6)
return x
def fun3(x):
x.append(7)
return x
int_list = [1, 2, 3, 4]
funs_family = (fun1, fun2, fun3)
new_list = [fun(int_list) for fun in funs_family ]
print(new_list)
我希望new_list的结果是
[1,2,3,4,5] [1,2,3,4,5,6] [1,2,3,4,5,6,7]
但实际结果是
[1,2,3,4,5,6,7] [1,2,3,4,5,6,7] [1,2,3,4,5,6,7]
谁能解释为什么实际结果与预期结果不同?
答案 0 :(得分:0)
在您的fun_family
方法中返回新列表,您将不会看到此问题:
def fun1(x):
x.append(5)
print("In Fun 1:")
print(x)
return list(x)
def fun2(x):
x.append(6)
return list(x)
def fun3(x):
x.append(7)
return list(x)
int_list = [1, 2, 3, 4]
funs_family = (fun1, fun2, fun3)
new_list = [fun(int_list) for fun in funs_family]
print(new_list)
>> [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7]]
答案 1 :(得分:0)
这里有一个类似的例子供您查看
int_list = [1, 2, 3, 4]
funs_family = (fun1, fun2, fun3)
new_list = [int_list for fun in funs_family]
int_list.append(5)
print(new_list)
请注意,new_list
完全不依赖于函数,实际上从未调用过它们。但是打印的是[1, 2, 3, 4, 5]
三次。这是因为new_list
中的三个列表都指向内存中的同一列表。因此,当您更改原件时,它会全部更改。
答案 2 :(得分:0)
因为要追加到列表,所以它实际上是同一对象。最后,您将打印完全相同的列表三遍。相反,也许您要做的就是在函数内创建一个新列表,然后将int添加到其中。
x = [1, 2, 3, 4]
x_copy = [i for i in x]
x_copy.append(5)
答案 3 :(得分:0)
每个函数都返回x
。
所以
new_list = [fun(int_list) for fun in funs_family ] print(new_list)
…返回三份x
,一旦理解完成,它们全部等于[1,2,3,4,5,6,7]
。
您想要的是x
的份,您可以使用[:]
获得:
new_list = [fun(int_list)[:] for fun in funs_family ]