나는 유니 코드 식별자를 가지고 놀았고 이것을 우연히 발견했습니다.
>>> 𝑓, x = 1, 2
>>> 𝑓, x
(1, 2)
>>> 𝑓, f = 1, 2
>>> 𝑓, f
(2, 2)
여기서 무슨 일이 일어나고 있습니까? 파이썬이에서 참조하는 객체를 대체하는 이유는 무엇 𝑓
입니까? 그 행동은 어디에 설명되어 있습니까?
나는 유니 코드 식별자를 가지고 놀았고 이것을 우연히 발견했습니다.
>>> 𝑓, x = 1, 2
>>> 𝑓, x
(1, 2)
>>> 𝑓, f = 1, 2
>>> 𝑓, f
(2, 2)
여기서 무슨 일이 일어나고 있습니까? 파이썬이에서 참조하는 객체를 대체하는 이유는 무엇 𝑓
입니까? 그 행동은 어디에 설명되어 있습니까?
a, a = 1, 2; a, a
. 이과는 아무 상관이 없습니다 f
또는 𝑓
.
𝑓 = 3; f
충분합니다.
답변:
모든 식별자는 구문 분석 중에 일반 형식 NFKC로 변환됩니다. 식별자 비교는 NFKC를 기반으로합니다.
unicodedata
변환을 테스트하는 데 사용할 수 있습니다 .
import unicodedata
unicodedata.normalize('NFKC', '𝑓')
# f
이는 파싱에서 '𝑓'
변환 됨을 나타냅니다 'f'
. 예상되는 결과 :
𝑓 = "Some String"
print(f)
# "Some String"
π
구별되는 Python 식별자를 가질 수 있습니다 p
. 내가 올바르게 이해한다면, NFK * 접기는 유니 코드 사람들이 처음에는 같은 문자 여야한다고 생각했던 문자에 관한 것이지만 일부 레거시 인코딩과의 하위 호환성 때문에 병합 할 수 없습니다.
다음은이 "기능"이 얼마나 끔찍한 지 보여주는 간단한 예입니다.
𝕋𝐡ᵢ𝔰_f𝔢𝘢𝚝𝓊ᵣₑ_𝕤ₕ𝔬𝔲𝖑𝔡_dₑ𝕗ᵢ𝘯i𝘵𝚎ℓy_𝒷𝘦_𝐚_𝚋ᵘg = 42
print(T𝗵ℹ𝚜_𝒇e𝖆𝚝𝙪ᵣe_ₛ𝔥º𝓾𝗹𝙙_𝚍e𝒇ᵢ𝒏ⁱtᵉ𝕝𝘆_𝖻ℯ_𝔞_𝖇𝖚𝓰)
# => 42
온라인으로 시도하십시오! (하지만 사용하지 마세요)
@MarkMeyer에서 언급했듯이 두 식별자는 똑같아 보이지만 구별 될 수 있습니다 ( "CYRILLIC CAPITAL LETTER A"및 "LATIN CAPITAL LETTER A").
А = 42
print(A)
# => NameError: name 'A' is not defined
А = 42; print(A)
-> "NameError : name 'A'is not defined"
𝑓=1
f=2
print(𝑓)