Bisakah Anda memberi tahu saya mengapa '?\\\?'=='?\\\\?'
memberi True
? Itu membuat saya gila dan saya tidak dapat menemukan jawaban yang masuk akal ...
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
python
python-2.7
kozooh
sumber
sumber
list()
Bahkan tidak perlu menyertakan :>>> '?\\\?'
'?\\\\?'
Jawaban:
Pada dasarnya, karena python sedikit lunak dalam pemrosesan garis miring terbalik. Mengutip dari https://docs.python.org/2.0/ref/strings.html :
(Penekanan dalam bahasa aslinya)
Oleh karena itu, dalam python, tiga garis miring terbalik tidak sama dengan empat, tetapi ketika Anda mengikuti garis miring terbalik dengan karakter seperti
?
, keduanya bersama-sama muncul sebagai dua karakter, karena\?
bukan urutan pelolosan yang dikenali.sumber
'escape''d'
). Anda bahkan tidak perlu mengingat karakter lain di sana!Ini karena garis miring terbalik bertindak sebagai karakter escape untuk karakter yang segera mengikutinya, jika kombinasi mewakili urutan escape yang valid. Selusin atau lebih urutan pelarian tercantum di sini . Mereka termasuk yang sudah jelas seperti baris baru
\n
, tab horizontal\t
, carriage return\r
dan yang lebih tidak jelas seperti karakter unicode yang diberi nama\N{...}
, misalnya\N{WAVY DASH}
yang mewakili karakter unicode\u3030
. Intinya adalah jika urutan escape tidak diketahui, urutan karakter dibiarkan dalam string apa adanya.Sebagian dari masalahnya mungkin juga karena keluaran interpreter Python menyesatkan Anda. Ini karena garis miring terbalik di-escape saat ditampilkan. Namun, jika Anda mencetak string tersebut, Anda akan melihat garis miring terbalik ekstra menghilang.
>>> '?\\\?' '?\\\\?' >>> print('?\\\?') ?\\? >>> '?\\\?' == '?\\?' # I don't know why you think this is True??? False >>> '?\\\?' == r'?\\?' # but if you use a raw string for '?\\?' True >>> '?\\\\?' == '?\\\?' # this is the same string... see below True
Untuk contoh spesifik Anda, dalam kasus pertama
'?\\\?'
, yang pertama\
mengosongkan garis miring terbalik kedua meninggalkan satu garis miring terbalik, tetapi garis miring terbalik ketiga tetap sebagai garis miring terbalik karena\?
bukan urutan escape yang valid. Karenanya string yang dihasilkan adalah?\\?
.Untuk kasus kedua
'?\\\\?'
, garis miring terbalik pertama lolos dari kedua, dan garis miring terbalik ketiga lolos keempat yang menghasilkan string?\\?
.Jadi itulah mengapa tiga garis miring terbalik sama dengan empat:
>>> '?\\\?' == '?\\\\?' True
Jika Anda ingin membuat string dengan 3 garis miring terbalik, Anda dapat keluar dari setiap garis miring terbalik:
>>> '?\\\\\\?' '?\\\\\\?' >>> print('?\\\\\\?') ?\\\?
atau Anda mungkin menemukan string "mentah" yang lebih mudah dipahami:
>>> r'?\\\?' '?\\\\\\?' >>> print(r'?\\\?') ?\\\?
Ini mengubah pemrosesan urutan escape untuk string literal. Lihat String Literals untuk lebih jelasnya.
sumber
'?\\\?'=='?\\?'
memberiFalse
, saya salah mengetik. Seharusnya'?\\\?'=='?\\\\?'
seperti yang ditunjukkan oleh pertanyaan, saya telah memperbaikinya.Karena
\x
dalam string karakter, ketikax
tidak salah satu karakter backslashable khusus sepertin
,r
,t
,0
, dll, mengevaluasi ke string dengan garis miring terbalik dan kemudianx
.>>> '\?' '\\?'
sumber
Dari halaman analisis leksikal python di bawah string literals di: https://docs.python.org/2/reference/lexical_analysis.html
Ada tabel yang mencantumkan semua escape sequence yang dikenali.
\\ adalah escape sequence yaitu === \
\? bukan merupakan escape sequence dan merupakan === \?
jadi '\\\\' adalah '\\' diikuti oleh '\\' yang merupakan '\\' (dua lolos \)
dan '\\\' adalah '\\' diikuti oleh '\' yang juga merupakan '\\' (satu lolos \ dan satu mentah \)
Selain itu, perlu dicatat bahwa python tidak membedakan antara tanda kutip tunggal dan ganda yang mengelilingi literal string, tidak seperti beberapa bahasa lain.
Jadi 'String' dan "String" adalah hal yang sama persis di python, mereka tidak mempengaruhi interpretasi dari urutan escape.
sumber
Jawaban mhawke cukup banyak mencakupnya, saya hanya ingin menyatakannya kembali dalam bentuk yang lebih ringkas dan dengan sedikit contoh yang menggambarkan perilaku ini.
Saya kira satu hal yang perlu ditambahkan adalah bahwa proses melarikan diri bergerak dari kiri ke kanan, sehingga
\n
pertama - tama menemukan garis miring terbalik dan kemudian mencari karakter untuk melarikan diri, kemudian menemukann
dan melarikan diri;\\n
menemukan garis miring terbalik pertama, menemukan garis miring kedua dan menghindarinya, kemudian menemukann
dan melihatnya sebagai n literal;\?
menemukan garis miring terbalik dan mencari karakter untuk melarikan diri, menemukan?
yang tidak dapat melarikan diri, dan diperlakukan\
sebagai garis miring terbalik literal.Seperti dicatat mhawke, kuncinya di sini adalah bahwa interpreter interaktif lolos dari garis miring terbalik saat menampilkan string. Saya menduga alasannya adalah untuk memastikan bahwa string teks yang disalin dari interpreter ke editor kode adalah string python yang valid. Namun, dalam hal ini pemberian kemudahan ini menyebabkan kebingungan.
>>> print('\?') # \? is not a valid escape code so backslash is left as-is \? >>> print('\\?') # \\ is a valid escape code, resulting in a single backslash '\?' >>> '\?' # same as first example except that interactive interpreter escapes the backslash \\? >>> '\\?' # same as second example, backslash is again escaped \\?
sumber