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]
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]
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
.
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.
Krotki są szybsze niż liście dostępu, co sprawia, że domyślnie
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
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ć? –
Dobre pytanie. Nie wiem, ale podejrzewam, że ma to związek z zmiennością list. – inspectorG4dget
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