Dlaczego ukośniki pojawiają się dwa razy?

Kiedy tworzę łańcuch zawierający ukośniki, są one zduplikowane:

>>> my_string = "why\does\it\happen?"
>>> my_string
'why\\does\\it\\happen?'
Dlaczego?
Author: Zero Piraeus, 2014-06-06

2 answers

To, co widzisz, to reprezentacja my_string stworzona przez jego __repr__() metoda. Jeśli go wydrukujesz, zobaczysz, że w rzeczywistości masz pojedyncze ukośniki, tak jak zamierzałeś: {]}

>>> print(my_string)
why\does\it\happen?

Poniższy ciąg znaków zawiera trzy , a nie cztery:

>>> 'a\\b'
'a\\b'
>>> len('a\\b')
3

Można uzyskać standardową reprezentację ciągu znaków (lub dowolnego innego obiektu) z repr() wbudowana funkcja:

>>> print(repr(my_string))
'why\\does\\it\\happen?'

Python reprezentuje ukośniki w łańcuchach jako \\ ponieważ ukośnik wsteczny jest znakiem escape - na przykład \n reprezentuje nowy wiersz, a \t reprezentuje tabulator.

To może czasem wpędzić cię w kłopoty:]}
>>> print("this\text\is\not\what\it\seems")
this    ext\is
ot\what\it\seems
Z tego powodu, Python musi być sposobem na powiedzenie, że naprawdę chcesz dwa znaki \n zamiast nowego wiersza, a robisz to, unikając samego ukośnika, z innym:
>>> print("this\\text\is\what\you\\need")
this\text\is\what\you\need

Gdy Python zwróci reprezentację ciągu znaków, będzie odtwarzany bezpiecznie, unikając wszystkich ukośniki (nawet jeśli nie byłyby częścią sekwencji ucieczki), i to właśnie widzisz. Jednak sam ciąg zawiera tylko pojedyncze ukośniki.

Więcej informacji na temat literałów ciągów Pythona można znaleźć pod adresem: String oraz literały bajtów w dokumentacji Pythona.

 55
Author: Zero Piraeus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 21:27:03

Jak wyjaśnia Zero Pireusa, używanie takich pojedynczych ukośników wstecznych (poza surowymi literałami ciągów) jest złym pomysłem.

Ale jest jeszcze jeden problem: w przyszłości błędem będzie użycie niezdefiniowanej sekwencji escape, takiej jak \d, zamiast dosłownego ukośnika, po którym następuje d. Więc zamiast po prostu mieć szczęście, że Twój ciąg użył \d zamiast \t, więc zrobił to, czego prawdopodobnie chciałeś, na pewno nie zrobi tego, co Ty chcę.

Od 3.6, już podnosi DeprecationWarning, chociaż większość ludzi ich nie widzi. Stanie się SyntaxError w jakiejś przyszłej wersji.


W wielu innych językach, w tym w C, użycie odwrotnego ukośnika, który nie uruchamia sekwencji escape oznacza, że Ukośnik jest ignorowany.

W kilku językach, w tym w Pythonie, odwrotny ukośnik, który nie uruchamia sekwencji escape, jest dosłownym ukośnikiem.

W niektórych językach, aby uniknąć nieporozumień co do tego, czy język jest podobny do C lub podobny do Pythona, i aby uniknąć problemu z \Foo działającym, ale \foo nie działającym, ukośnik odwrotny, który nie uruchamia sekwencji escape jest nielegalny.

 4
Author: abarnert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 07:38:24