Bawiłem się identyfikatorami Unicode i natknąłem się na to:
>>> 𝑓, x = 1, 2
>>> 𝑓, x
(1, 2)
>>> 𝑓, f = 1, 2
>>> 𝑓, f
(2, 2)
Co tu się dzieje? Dlaczego Python zastępuje obiekt, do którego się odwołuje 𝑓
, ale tylko czasami? Gdzie opisano to zachowanie?
𝑓=1
f=2
print(𝑓)
a, a = 1, 2; a, a
. To nie ma nic wspólnego zf
lub𝑓
.𝑓 = 3; f
wystarczyłby.Odpowiedzi:
PEP 3131 - Obsługa identyfikatorów innych niż ASCII mówi
Możesz użyć
unicodedata
do przetestowania konwersji:import unicodedata unicodedata.normalize('NFKC', '𝑓') # f
co wskazywałoby, że
'𝑓'
zostanie przekonwertowany na'f'
podczas analizy. Prowadząc do oczekiwanego:𝑓 = "Some String" print(f) # "Some String"
źródło
π
jako identyfikator Pythona inny niżp
dobrze. Jeśli dobrze rozumiem, składanie NFK * dotyczy znaków, które zdaniem ludzi z Unicode powinny być tymi samymi znakami na początku, ale nie można ich scalić ze względu na kompatybilność wsteczną z niektórymi starszymi kodowaniami.Oto mały przykład, aby pokazać, jak okropna jest ta „funkcja”:
𝕋𝐡ᵢ𝔰_f𝔢𝘢𝚝𝓊ᵣₑ_𝕤ₕ𝔬𝔲𝖑𝔡_dₑ𝕗ᵢ𝘯i𝘵𝚎ℓy_𝒷𝘦_𝐚_𝚋ᵘg = 42 print(T𝗵ℹ𝚜_𝒇e𝖆𝚝𝙪ᵣe_ₛ𝔥º𝓾𝗹𝙙_𝚍e𝒇ᵢ𝒏ⁱtᵉ𝕝𝘆_𝖻ℯ_𝔞_𝖇𝖚𝓰) # => 42
Wypróbuj online! (Ale proszę, nie używaj tego)
Jak wspomniał @MarkMeyer, dwa identyfikatory mogą się różnić, nawet jeśli wyglądają tak samo („CYRYLOWA WIELKA LITERA A” i „ŁACIŃSKA WIELKA LITERA A”)
А = 42 print(A) # => NameError: name 'A' is not defined
źródło
А = 42; print(A)
-> "NameError: name 'A' is not specified"