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? 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.
>>> 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.
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.
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