Byłem zdezorientowany dzisiaj przez porównanie łańcuchowe: wydaje się, że Python ponownie używa ciągów (co jest sensowną rzeczą, ponieważ są one niezmienne). Aby sprawdzić ten fakt, zrobiłem co następuje:W jaki sposób Python robi ciąg magii?
>>> a = 'xxx'
>>> b = 'xxx'
>>> a == b
True
>>> a is b
True
>>> id(a)
140141339783816
>>> id(b)
140141339783816
>>> c = 'x' * 3
>>> id(c)
140141339783816
>>> d = ''.join(['x', 'x', 'x'])
>>> id(d)
140141339704576
Co jest nieco zaskakujące. kilka pytań:
- Czy python sprawdza całą zawartość swojej tablicy łańcuchów podczas definiowania nowych ciągów?
- Czy istnieje ograniczenie rozmiaru łańcucha?
- Jak działa ten mechanizm (porównywanie skrótów łańcuchów?)
- Nie wydaje się jednak, aby był używany dla wszystkich rodzajów generowanych ciągów. Jaka jest tu zasada?
'is' testy tożsamość, czyli miejsc pamięci . '==' sprawdza równość. Nie jest rozsądnie używać ich zamiennie, ponieważ niektóre łańcuchy znaków, int itp. Są internowane w imię optymalizacji. – inspectorG4dget
Dzięki, ale już to wiem (o nic nie pytałem). Moje pytanie nie dotyczy 'jest' kontra' == ': chodzi o to, w jaki sposób wewnętrznie pyton ponownie używa ciągów. Innymi słowy, o wewnętrznej implementacji używanej przez Pythona, aby zdecydować, że ciąg nie musi być dodany do swojej tabeli napisów, ale może być ponownie użyty. Jak widać na moim przykładzie, mechanizm ten nie dotyczy wszystkich równych łańcuchów, dlatego chciałbym zrozumieć, kiedy i jak jest używany. – dangonfast
Możesz być zainteresowany [co ma na myśli Martijn Pieters] (https://www.codementor.io/python-tutorial/stack-overflow-martijn-pieters-python-optimization?utm_source = reddit-content & utm_medium = blog & utm_term = python-tutorial-python-internals & utm_content = blog & utm_campaign = reddit-content) – inspectorG4dget