2015-06-01 12 views
13

Dlaczego jest krotka (lub dict) obowiązkowa do stosowania z ciągiem format:Dlaczego lista nie jest dozwolona w przypadku ciągów formatów?

"%s %d" % ("text", 42) 

co byłoby niekorzystne z poniższych?

"%s %d" % ["text", 42] 
+1

Ponieważ składnia w [zdefiniowana z krotki lub obiektu mapowania] (https://docs.python.org/2/library/stdtypes .html # string-formatting-operations).Z tego samego powodu nie używałbyś podwójnych cudzysłowów do definiowania liczby całkowitej. Oni bardzo dobrze mogliby użyć list, ale dlaczego mieliby to robić? –

+9

Dobre pytanie. Nie wiem, ale podejrzewam, że ma to związek z zmiennością list. – inspectorG4dget

+0

Brak wyjaśnień podanych w [źródło] (https://github.com/python-git/python/blob/master/Objects/stringobject. C# L4614). Zgaduję, że powodem jest "ponieważ wymagałoby to niezrównanej ilości pracy do wdrożenia, a niewystarczająca liczba ludzi tego chce" – Kevin

Odpowiedz

1

zgaduję, ale spodziewam się, że to dlatego Gvr chciał zminimalizować liczbę różnych typów T dla których 'my object is: %s' % T(...) zawiedzie. Jest to na tyle złe, że nie jest on dla namedtuple s ;-)

To znaczy, pozwalając '%s %s' % [1,2] tworzy dodatkowy pułapkę dla nieostrożnych, ponieważ uniemożliwia Ci formatowania sam [1,2] z formatem %s.

-1

Najprawdopodobniej użycie krotki w formatowaniu ciągu znaków ma na celu wyeliminowanie niejasności. Oznacza to, że masz niezmienny obiekt, taki jak lista lub dykta, obiekty te prawdopodobnie się zmienią w przyszłości, więc formatowanie może się nie udać lub może być sformatowane inaczej niż oczekiwałeś! Rzeczywiście użycie krotki jest o wiele jaśniejsze niż użycie listy, ponieważ krotka nie może być zmieniona w pałacu jak lista.

Rozważmy na przykład następujący kod:

T = ("spam", "ham") 

s = "%s and %s" % T 

od lewa obiekt jest krotka, można upewnić się, że nigdy nie zostanie zmieniony w miejscu przez operację, gdy program jest uruchamiany, a więc może mieć spokój ducha o tym. Nie można jednak powiedzieć, że używanie krotek jest całkowicie bezpieczne, ponieważ można zrobić coś takiego, jak T += ("holy cow",), a tym samym dodać trzeci element do krotki, który spowoduje, że wyrażenie będzie błędne. Krotki są jednak mniej prawdopodobne niż listy, ponieważ są niezmiennymi obiektami. Lista może zostać zmieniona w dowolnym miejscu i kto wie, gdzie i kiedy lista może się zmienić w programie o wartości miliona linii?

Wskazówki co się dzieje, gdy używamy list zamiast tutaj:

L = ["spam", "ham"] 
L.append("Ice-cream")  #line 103984.. above "%s and %s" % L 

s = "%s and %s" % L    #Error, three values in L 

Można by pomyśleć, że L zawiera tylko "spam" i "ham", ale rzeczywiście L zawiera inny obiekt, który został dodany z pracy, gdy program prowadził. Możesz sam wykryć ten błąd w mniejszym systemie, ale zastanów się, czy lista L została użyta do zachowania stanu między funkcjami w gigantycznym systemie, skąd znasz jego wartość lub jakie zmiany mogą wystąpić? Co gorsza, możesz przekazać s do funkcji przetwarzającej sformatowany ciąg znaków w pewien określony sposób. Twoja funkcja tutaj natychmiast się nie powiedzie, jeśli zależy od określonego formatu ciągu. A jeśli nie z wyjątkiem określonego formatu ciągu, może przetworzyć operację, którą zamierzamy odwrócić.

Może to być niejednoznaczne, ponieważ trzeba prześledzić wszystkie kody; z pewnością jest to żmudne zadanie w dużych systemach. Listy nie są chronione przed zmianami, jest na odwrót, powinieneś zmieniać i manipulować listami tak, jak chcesz. ponieważ lista może być zmieniana od czasu do czasu, Python używa tylko krotki w wyrażeniu formatującym, aby nie dopuścić do tego zamieszania. Zasadniczo, krotki są typem listy, ale są stałymi, nie można ich zmienić w miejscu. to dosłownie upraszcza działanie debugowania programu.

+0

Myślę, że punkt, który wprowadziłeś przy zmianie listy między inicjalizacją a użyciem jest prawidłowy. Niestety istnieje wiele innych aspektów, które mają niewiele wspólnego z pytaniem lub są mylące ... – steffen

+0

Rozważ nową zmianę. – direprobs

0

Krotki są szybsze niż liście dostępu, co sprawia, że ​​domyślnie

+0

czy to naprawdę ma znaczenie? W końcu formatujemy łańcuchy, które nigdy nie są szybkie, tzn. Nigdy nie powinny być wykonywane w czasie krytycznym kodem. Co więcej, zwykle robi się to z 1 do 10 elementów w krotce. – steffen

Powiązane problemy