在Python中过滤,映射和缩小是否会创建列表的新副本?

时间:2016-09-03 15:21:39

标签: python python-2.7 lambda higher-order-functions

使用Python 2.7。我们说我们有list_of_nums = [1,2,2,3,4,5] 我们想要删除所有出现的2.我们可以实现它 list_of_nums[:] = filter(lambda x: x! = 2, list_of_nums)list_of_nums = filter(lambda x: x! = 2, list_of_nums)

这是"就地"代换?另外,我们在使用过滤器时是否创建了列表副本?

1 个答案:

答案 0 :(得分:5)

list_of_nums[:] = filter(lambda x: x != 2, list_of_nums)

list_of_nums = filter(lambda x: x != 2, list_of_nums)

是两个不同的操作,最终 结果相同。

在这两种情况下,

filter(lambda x: x != 2, list_of_nums)

返回一个包含与过滤器匹配的项目的新列表(在Python 2中),或者返回一个返回相同项目的list_of_nums的可迭代项目(在Python 3中)。

第一种情况,

list_of_nums[:] = filter(lambda x: x != 2, list_of_nums)

然后删除list_of_nums中的所有项目,并将其替换为新列表中的项目或可迭代项目。

第二种情况,

list_of_nums = filter(lambda x: x != 2, list_of_nums)

将新列表分配给变量list_of_nums

这会产生影响的时间是:

def processItemsNotTwo_case1(list_of_nums):
    list_of_nums[:] = filter(lambda x: x != 2, list_of_nums)
    # do stuff here
    # return something

def processItemsNotTwo_case2(list_of_nums):
    list_of_nums = filter(lambda x: x != 2, list_of_nums)
    # do stuff here
    # return something

list1 = [1,2,2,3,4,5]
processItemsNotTwo_case1(list1)
list2 = [1,2,2,3,4,5]
processItemsNotTwo_case2(list2)

使用此代码,list1以新内容[1,3,4,5]结束,而list2以原始内容[1,2,2,3,4,5]结束。