2014-01-28 75 views

回答

1

Int對​​象的內部存儲爲2的補碼錶示形式,就像在C中一樣(好吧,如果範圍值允許,這是真的,如果它不適合,python可以自動將它轉換爲其他表示形式)。

現在要獲取字符串表示形式,您必須將其更改爲一個字符串(而字符串僅僅是一些不可變的字符列表)。該算法是簡單的數學計算:將數字除以10(整數除法)並保留餘數,並將其加到字符代碼'0'。你得到單位數字。繼續分組的結果,直到分組結果爲零。就這麼簡單。

此方法適用於任何整數表示,但當然,調用ltoa C庫函數或等效的C代碼可能會比在python中編寫代碼更有效。

1

當你在一個對象上調用str()時,它會調用它的類__ str__魔術方法。

例如

class NewThing: 
    def __init__(self, name): 
     self.name = name 

    def __str__(self): 
     return self.name 

從那裏可以使用在物體上的STR()方法,或直接在字符串中使用它。在magic methods here

不知道這是否是你想要的,但我不能評論尚未提出澄清的問題

>> thing = NewThing("poop") 
>> print thing 
>> poop 

更多信息。

+0

我對_ _ str _ _方法背後的實際魔術感興趣,特別是使用內置的int對象。當我調用str(6)時,int對象如何使用_ _ str _ _返回數字6的字符串表示形式? –

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:]) 
+0

很酷。您是如何在Python源代碼中搜索函數的?我踢了一個通用的iota實現。 – user2864740

+0

@ user2864740:官方的Python源代碼庫是http://hg.python.org/。我手動搜索,尋找目錄和文件,聽起來像我正在尋找。 – user2357112

+1

@ user2864740下面是它被引用的地方的直接鏈接:http://hg.python.org/cpython/file/c6880edaf6f3/Objects/intobject.c –

相關問題