列表理解输出

时间:2019-06-12 14:35:38

标签: python list list-comprehension

我试图通过传递一个函数列表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] 

谁能解释为什么实际结果与预期结果不同?

4 个答案:

答案 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 ]