Estaba jugando con identificadores Unicode y me encontré con esto:
>>> 𝑓, x = 1, 2
>>> 𝑓, x
(1, 2)
>>> 𝑓, f = 1, 2
>>> 𝑓, f
(2, 2)
¿Que está pasando aqui? ¿Por qué Python reemplaza el objeto al que se hace referencia 𝑓, pero solo a veces? ¿Dónde se describe ese comportamiento?

𝑓=1f=2print(𝑓)a, a = 1, 2; a, a. Esto no tiene nada que ver confo𝑓.𝑓 = 3; fbastaría.Respuestas:
PEP 3131 - Admite identificadores no ASCII dice
Puede utilizar
unicodedatapara probar las conversiones:import unicodedata unicodedata.normalize('NFKC', '𝑓') # flo que indicaría que
'𝑓'se convierte'f'en al analizar. Conduciendo a lo esperado:𝑓 = "Some String" print(f) # "Some String"fuente
πcomo un identificador de Python que sea distinto depmuy bien. Si lo entiendo correctamente, el plegado NFK * se trata de caracteres que la gente de Unicode pensó que deberían haber sido el mismo carácter para empezar, pero no se pueden fusionar debido a la compatibilidad con versiones anteriores con algunas codificaciones heredadas.Aquí hay un pequeño ejemplo, solo para mostrar lo horrible que es esta "función":
𝕋𝐡ᵢ𝔰_f𝔢𝘢𝚝𝓊ᵣₑ_𝕤ₕ𝔬𝔲𝖑𝔡_dₑ𝕗ᵢ𝘯i𝘵𝚎ℓy_𝒷𝘦_𝐚_𝚋ᵘg = 42 print(T𝗵ℹ𝚜_𝒇e𝖆𝚝𝙪ᵣe_ₛ𝔥º𝓾𝗹𝙙_𝚍e𝒇ᵢ𝒏ⁱtᵉ𝕝𝘆_𝖻ℯ_𝔞_𝖇𝖚𝓰) # => 42¡Pruébelo en línea! (Pero por favor no lo uses)
Y como lo menciona @MarkMeyer, dos identificadores pueden ser distintos aunque tengan el mismo aspecto ("LETRA A MAYÚSCULA CIRÍLICA" y "LETRA A CAPITAL LATINA")
А = 42 print(A) # => NameError: name 'A' is not definedfuente
А = 42; print(A)-> "NameError: el nombre 'A' no está definido"