我理解使用内置方法str()
将int转换为字符串很容易。然而,究竟发生了什么?我明白它可能指向了
int对象的__str__
方法,但它如何计算“非正式”字符串表示?试着看源头而没找到领先;任何帮助赞赏。
答案 0 :(得分:3)
Python反复将int除以10并使用% 10
逐个获取小数位数。
只是为了确保我们正在查看正确的代码,here's Python 2.7用于将整数转换为字符串的函数:
static PyObject *
int_to_decimal_string(PyIntObject *v) {
char buf[sizeof(long)*CHAR_BIT/3+6], *p, *bufend;
long n = v->ob_ival;
unsigned long absn;
p = bufend = buf + sizeof(buf);
absn = n < 0 ? 0UL - n : n;
do {
*--p = '0' + (char)(absn % 10);
absn /= 10;
} while (absn);
if (n < 0)
*--p = '-';
return PyString_FromStringAndSize(p, bufend - p);
}
这会分配足够的空间来存储字符串的字符,然后从最后开始逐个填充数字。完成数字后,如果数字为负数,则在前面贴上-
符号,并从字符构造Python字符串对象。将其翻译成Python,我们得到以下结果:
def int_to_decimal_string(n):
chars = [None] * enough # enough room for any int's string representation
abs_n = abs(n)
i = 0
while True:
i += 1
chars[-i] = str(abs_n % 10) # chr(ord('0') + abs_n % 10) is more accurate
abs_n //= 10
if not abs_n:
break
if n < 0:
i += 1
chars[-i] = '-'
return ''.join(chars[-i:])
答案 1 :(得分:1)
当你在一个对象上调用str()时,它会调用它的类__ str__ magic方法。
例如
class NewThing:
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
从那里你可以在对象上使用str()方法,或者直接在字符串中使用它。
>> thing = NewThing("poop")
>> print thing
>> poop
的更多信息
不确定这是否是你想要的,但我还没有发表评论,要求澄清问题。
答案 2 :(得分:1)
Int对象在内部存储为2的补码表示,就像在C中一样(如果范围值允许,这是真的,如果它不再适合,python可以自动将其转换为其他表示)。
现在要获取字符串表示,您必须将其更改为字符串(而字符串只是一些不可更改的字符列表)。算法是简单的数学计算:将数字除以10(整数除法)并保留余数,将其加到字符代码'0'。你得到单位数字。继续除法的结果,直到除法的结果为零。就这么简单。
这种方法适用于任何整数表示,但当然,如果可能的话,调用ltoa C库函数或等效的C代码来执行此操作会比在python中编码更有效。