为什么Python将符号“²”识别为数字?

12

有人能否说明“²”是一个符号还是一个数字?(alt+1277,2的幂)

print("²".isdigit())
# True
print("²".isnumeric())
# True

因为Python说它是数字,但实际上它并不是数字。我错了吗?还是这是个bug?


3
这是一个数字——显然是数字 2。但它不是 ASCII 码。 - John Gordon
日语汉字数字也是数字。只是你可能会将其转换为整数。 - Jean-François Fabre
3
关键在于,isdigitisnumeric都不意味着由这些值组成的字符串可以用作参数传递给例如int。如果您想知道字符串s是否表示特定的int值,请不要检查s,而是尝试使用int(s)并捕获引发的异常。 - chepner
2个回答

17

这是一个数字,明确地记录在文档中:

str.isdigit()

如果字符串中的所有字符都是数字且至少有一个字符,则返回True,否则返回False。数字包括十进制字符和需要特殊处理的数字,如兼容上标数字。这包括不能用于十进制数字的数字,如Kharosthi数字。形式上,数字是具有属性值Numeric_Type=Digit或Numeric_Type=Decimal的字符。

关于 Numeric_Type,这是由Unicode定义的:

Numeric_Type=Digit

位置十进制字符(Numeric_Type=Decimal)或其序列的变体。这些包括上/下标,通过添加字符(如括号、点或逗号)进行封闭或装饰。


4

Python聪明地将Unicode字符标记为数字,因为这是可能的。

为了补充这个好答案,请注意,您甚至可以获得字符的浮点表示:

>>> from unicodedata import numeric
>>> numeric("²")
2.0

之所以是浮点数,是因为Unicode版本的1/2、3/2等都有。

(请参见如何将Unicode数字转换为整数?


来自C和C++世界,这让我感到相当不适。出于好奇,数字(leminscate)会发生什么? - Bathsheba
1
是的 :) 但你不必使用所有功能。就我个人而言,我从未在我的脚本中使用Unicode。 - Jean-François Fabre
我主要是Python开发人员,这也让我有点不安 :) 但是请记住,进行数学计算的程序并不是Unicode的唯一用例。仅仅因为某些字符被认为是数字,并不意味着它们应该被数值化使用。 - chepner
@chepner:是的,这是个很好的观点,在C和C++中有类似之处。例如,08在两种语言中都是无效的整数常量,因为前导0表示八进制,而8是无效的八进制数字。但它仍然是一个数字。 - Bathsheba
除此之外,你可以执行 int("08") ,并且由于指定了基数(默认为10),它将正确地转换为8。 - Jean-François Fabre
@Jean-FrançoisFabre:你的回答解释了为什么Python说它是一个数字,因为我猜测它被定义为浮点数,但是我问你,对于你来说,那是一个字符、符号还是数字(而不是Python)? - KianRST

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接