Ich habe mit Unicode-Kennungen herumgespielt und bin darauf gestoßen:
>>> 𝑓, x = 1, 2
>>> 𝑓, x
(1, 2)
>>> 𝑓, f = 1, 2
>>> 𝑓, f
(2, 2)
Was ist hier los? Warum ersetzt Python das Objekt, auf das verwiesen wird 𝑓
, aber nur manchmal? Wo ist dieses Verhalten beschrieben?
𝑓=1
f=2
print(𝑓)
a, a = 1, 2; a, a
. Das hat nichts mitf
oder zu tun𝑓
.𝑓 = 3; f
würde ausreichen.Antworten:
PEP 3131 - Unterstützung von Nicht-ASCII-Kennungen sagt
Sie können
unicodedata
die Conversions testen:import unicodedata unicodedata.normalize('NFKC', '𝑓') # f
was darauf hinweisen würde, dass beim Parsen
'𝑓'
konvertiert wird'f'
. Führen zu den erwarteten:𝑓 = "Some String" print(f) # "Some String"
quelle
π
als Python-Kennung eine haben, die sich vonp
gut unterscheidet. Wenn ich das richtig verstehe, handelt es sich bei der NFK * -Faltung um Zeichen, von denen die Unicode-Leute anfangs dachten, sie hätten das gleiche Zeichen sein sollen, aber sie können aufgrund der Abwärtskompatibilität mit einigen älteren Codierungen nicht zusammengeführt werden.Hier ist ein kleines Beispiel, um zu zeigen, wie schrecklich diese "Funktion" ist:
𝕋𝐡ᵢ𝔰_f𝔢𝘢𝚝𝓊ᵣₑ_𝕤ₕ𝔬𝔲𝖑𝔡_dₑ𝕗ᵢ𝘯i𝘵𝚎ℓy_𝒷𝘦_𝐚_𝚋ᵘg = 42 print(T𝗵ℹ𝚜_𝒇e𝖆𝚝𝙪ᵣe_ₛ𝔥º𝓾𝗹𝙙_𝚍e𝒇ᵢ𝒏ⁱtᵉ𝕝𝘆_𝖻ℯ_𝔞_𝖇𝖚𝓰) # => 42
Probieren Sie es online aus! (Aber bitte nicht benutzen)
Und wie von @MarkMeyer erwähnt, können zwei Bezeichner unterschiedlich sein, obwohl sie gleich aussehen ("CYRILLIC CAPITAL LETTER A" und "LATIN CAPITAL LETTER A").
А = 42 print(A) # => NameError: name 'A' is not defined
quelle
А = 42; print(A)
-> "NameError: Name 'A' ist nicht definiert"