2013-05-20 4 views
8

Czy w języku Python możliwe jest aktualizowanie listy obiektów ze zrozumieniem listy lub w podobny sposób? Na przykład chciałbym ustawić właściwość wszystkich obiektów z listy: Aktualizacja właściwości obiektu w sposobie rozumienia listy

result = [ object.name = "blah" for object in objects] 

lub map funkcja

result = map(object.name = "blah", objects) 

Może to zostać osiągnięte bez za-zapętlenie z ustawieniem własności?

(Uwaga: Wszystkie powyższe przykłady są celowo tak i podane są jedynie do wyrażania idei)

+0

Ostatnio koduję dużo javascriptu, gdzie coś takiego jest możliwe: 'const result = objects.map (object => object.name = 'blah')' to jest mała zmiana kontekstu wracając do pythona. – cosmosa

Odpowiedz

20

Ostatecznie zadanie jest „komunikat”, a nie „ekspresja”, a więc nie może być stosowany w lambda wyrażenie lub zrozumienie listy. Aby osiągnąć to, czego próbujesz, potrzebujesz regularnej funkcji.

Jest wbudowane który to zrobi (powrót listę None):

[setattr(obj,'name','blah') for obj in objects] 

Ale nie należy go używać. Po prostu użyj pętli. Wątpię, że zauważysz różnicę w wydajności, a pętla jest o wiele jaśniejsza.

Jeśli naprawdę potrzebujemy 1-liner (choć nie widzę dlaczego):

for obj in objects: obj.name = "blah" 

Uważam, że większość ludzi chce korzystać z list-listowych bo ktoś im powiedział, że są one "szybki". To prawda, ale tylko do tworzenia nowej listy. Korzystanie ze zrozumiałej listy dla efektów ubocznych prawdopodobnie nie przyniesie żadnych korzyści związanych z wydajnością, a twój kod będzie cierpieć z punktu widzenia czytelności. Naprawdę, najważniejszym powodem, dla którego należy używać rozumienia list zamiast równoważnej pętli z .append jest to, że jest łatwiejszy do odczytania.

+0

Zgadzam się w 100%, że tak naprawdę nie należy tego robić, ale jeśli musisz to zrobić, to przynajmniej zamknij transformację do funkcji zwracającej wartość Falseya i użyj warunku "jeśli" w zrozumieniu, aby ją zastosować, więc nie generujesz całej nowej listy, gdy chcesz tylko przekształcić w miejscu. –

+1

@ sr2222 - Przypuszczam, że możesz * to * zrobić: '[Brak dla obiektów w obiektach, jeśli setattr (obj, 'name', 'blah')]', ale to jest nawet mniej jasne niż moja wersja. Persjonalnie, powiedziałbym, że lista "Brak" jest mniejszym złem niż zwiększone zamieszanie z tego podejścia. Ale w każdym razie - nie należy ich używać. użyj pętli :) – mgilson

+0

No cóż, lista nie powinna być używana dla efektów ubocznych, ponieważ sprawia, że ​​kod jest trudny do odczytania. Ale jeśli zamierzasz zastosować zrozumienie listy dla efektu ubocznego, wydaje się, że powinieneś przynajmniej spróbować zrobić to w sposób, który nie tworzy bezużytecznego artefaktu. Jeśli chodzi o czytelność, to nie sądzę, by jedno było jasne. :) –