将int转换为字符串时实际发生了什么?

时间:2014-01-28 23:49:44

标签: python

我理解使用内置方法str()将int转换为字符串很容易。然而,究竟发生了什么?我明白它可能指向了    int对象的__str__方法,但它如何计算“非正式”字符串表示?试着看源头而没找到领先;任何帮助赞赏。

3 个答案:

答案 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

有关magic methods here

的更多信息

不确定这是否是你想要的,但我还没有发表评论,要求澄清问题。

答案 2 :(得分:1)

Int对​​象在内部存储为2的补码表示,就像在C中一样(如果范围值允许,这是真的,如果它不再适合,python可以自动将其转换为其他表示)。

现在要获取字符串表示,您必须将其更改为字符串(而字符串只是一些不可更改的字符列表)。算法是简单的数学计算:将数字除以10(整数除法)并保留余数,将其加到字符代码'0'。你得到单位数字。继续除法的结果,直到除法的结果为零。就这么简单。

这种方法适用于任何整数表示,但当然,如果可能的话,调用ltoa C库函数或等效的C代码来执行此操作会比在python中编码更有效。