Dlaczego dodawanie list w Pythonie musi być jednorodne?
Czy każdy zaznajomiony z wewnętrznymi elementami Pythona (CPython lub innymi implementacjami) może wyjaśnić, dlaczego dodanie listy musi być jednorodne:
In [1]: x = [1]
In [2]: x+"foo"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
C:\Users\Marcin\<ipython-input-2-94cd84126ddc> in <module>()
----> 1 x+"foo"
TypeError: can only concatenate list (not "str") to list
In [3]: x+="foo"
In [4]: x
Out[4]: [1, 'f', 'o', 'o']
Dlaczego niex+"foo"
powyżej zwracają tę samą wartość co końcowa wartośćx
w powyższym transkrypcie?
To pytanie wynika z pytania NPE tutaj:Czy zachowanie listy Pythona + = iterowalne jest udokumentowane w dowolnym miejscu?
Aktualizacja: Wiem, że nie jest to wymagane heterogeniczne+=
działa (ale tak jest) i podobnie nie jest wymagane, aby było heterogeniczne+
być błędem. To pytanie dotyczy tego, dlaczego dokonano tego ostatniego wyboru.
Zbyt wiele można powiedzieć, że wyniki dodania sekwencji do listy są niepewne. Gdyby to było wystarczające zastrzeżenie, sensowne byłoby zapobieganie heterogeniczności+=
. Aktualizacja 2: W szczególności python zawsze deleguje wywołania operatora do lewego operandu, więc nie ma znaczenia, „co należy zrobić”, pojawia się ”: obiekt po lewej stronie zawsze rządzi (chyba że deleguje go na prawo).
Aktualizacja3: Dla każdego, kto twierdzi, że jest to decyzja dotycząca projektu, proszę wyjaśnić (a), dlaczego nie jest to udokumentowane; lub (b) jeżeli jest to udokumentowane.
Aktualizacja4: „co powinno[1] + (2, )
powrót? ”Powinien zwracać wartość wyniku równą wartości zmiennejx
początkowo trzymanie[1]
natychmiast pox+=(2, )
. Ten wynik jest dobrze zdefiniowany.