나는 유니 코드 식별자를 가지고 놀았고 이것을 우연히 발견했습니다.
>>> ?, x = 1, 2
>>> ?, x
(1, 2)
>>> ?, f = 1, 2
>>> ?, f
(2, 2)
여기서 무슨 일이 일어나고 있습니까? 파이썬이에서 참조하는 객체를 대체하는 이유는 무엇 ?
입니까? 그 행동은 어디에 설명되어 있습니까?
답변
모든 식별자는 구문 분석 중에 일반 형식 NFKC로 변환됩니다. 식별자 비교는 NFKC를 기반으로합니다.
unicodedata
변환을 테스트하는 데 사용할 수 있습니다 .
import unicodedata
unicodedata.normalize('NFKC', '?')
# f
이는 파싱에서 '?'
변환 됨을 나타냅니다 'f'
. 예상되는 결과 :
? = "Some String"
print(f)
# "Some String"
답변
다음은이 “기능”이 얼마나 끔찍한 지 보여주는 간단한 예입니다.
??ᵢ?_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