簡體   English   中英

filter() 是否在 python 中就地工作?

[英]Does filter() work in-place in python?

如果我在列表上調用 filter(),請說:

>>> filter(lambda x: x > 1, [1,2,3,4])
[2, 3, 4]

這是:

a) 在內存中創建一個帶有結果的全新列表

b) 它只是從現有列表中彈出() 項並返回相同的列表嗎?

過濾器返回一個包含滿足給定條件的表達式元素的新列表。 原始列表完好無損。 在你的情況下,這並不重要,因為你的列表是一個就地常量——但我假設你有一個更通用的應用程序。

請參閱文檔:它指出filter構造了一個新的可迭代對象(列表、元組、...)。

蟒蛇 2

在 Python2 中, filter()返回一個新的列表對象。 傳遞給函數的列表不受影響。 這可以通過一個非常簡單的例子來觀察:

>>> lst = [1, 2, 3, 4, 5]
>>> filter(lambda element: element < 4, lst)
[1, 2, 3]
>>> lst # lst is unaffected
[1, 2, 3, 4, 5]
>>> 

蟒蛇 3

在 Python3 中, filter()也不會影響傳入的列表。但是,它不會返回新的列表對象。 相反,它返回一個過濾器對象:

>>> lst = [1, 2, 3, 4, 5]
>>> filter(lambda element: element < 4, lst)
<filter object at 0x7fb69fef1b00>
>>> lst
[1, 2, 3, 4, 5]
>>> 

如果你想要一個列表對象,你需要顯式地將filter()的返回值轉換為一個列表:

>>> lst = [1, 2, 3, 4, 5]
>>> list(filter(lambda element: element < 4, lst))
[1, 2, 3]
>>> 

不過,在這兩種情況下,您的第一個假設都是正確的。 filter()不會就地工作,它返回一個新對象。

>>> a = [1,2,3,4]
>>> list(filter(lambda x: x > 1, a))
[2, 3, 4]
>>> a 
[1, 2, 3, 4]

為了完整起見,我將把它留在這里。

>>> a = [i for i in range(10)]
>>> b = list(filter(lambda x: x > 1, a))
>>> id(a)
4510567816
>>> id(b)
4500803808
>>> id(a) == id(b)
False

如果您了解 Python,您就會知道id為您提供了一個唯一的參考標識符。 如果它們不相等,則意味着它們不同。

Filter 作用於一個可迭代對象並創建一個新的可交互對象。

不是真的

class Person:
    def __init__(self, age) -> None:
        self.age = age

p1 = Person(1)
p2 = Person(2)
p3 = Person(3)
p4 = Person(4)
p5 = Person(5)
p6 = Person(6)

list1= [p1, p2, p3, p4, p5,  p6]
list2 = list(filter(lambda p : p.age > 3, list1))

list2[0].age = 100

print(p4.age)
print(p5.age)
print(p6.age)

輸出:

100
5
6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM