我知道很容易通過使用內置方法str()
將int轉換爲字符串。但是,究竟發生了什麼?我知道它可能指向int對象的方法,但它是如何計算「非正式」字符串表示的呢?試圖看着源頭,沒有找到領先;任何幫助讚賞。當我將int轉換爲字符串時,實際發生了什麼?
回答
Int對象的內部存儲爲2的補碼錶示形式,就像在C中一樣(好吧,如果範圍值允許,這是真的,如果它不適合,python可以自動將它轉換爲其他表示形式)。
現在要獲取字符串表示形式,您必須將其更改爲一個字符串(而字符串僅僅是一些不可變的字符列表)。該算法是簡單的數學計算:將數字除以10(整數除法)並保留餘數,並將其加到字符代碼'0'。你得到單位數字。繼續分組的結果,直到分組結果爲零。就這麼簡單。
此方法適用於任何整數表示,但當然,調用ltoa C庫函數或等效的C代碼可能會比在python中編寫代碼更有效。
當你在一個對象上調用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
更多信息。
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:])
很酷。您是如何在Python源代碼中搜索函數的?我踢了一個通用的iota實現。 – user2864740
@ user2864740:官方的Python源代碼庫是http://hg.python.org/。我手動搜索,尋找目錄和文件,聽起來像我正在尋找。 – user2357112
@ user2864740下面是它被引用的地方的直接鏈接:http://hg.python.org/cpython/file/c6880edaf6f3/Objects/intobject.c –
- 1. 當在HIVE中字符串被隱式轉換爲int時會發生什麼?
- 2. 將字符串轉換爲字節數組時發生了什麼
- 3. 在Java中將字節轉換爲字符串時發生了什麼?
- 4. 使用遞歸反轉字符串時實際發生了什麼
- 5. 將字符串轉換爲int,int轉換爲字符串
- 6. 將char轉換爲字符串時會發生什麼? (JAVA)
- 7. 當您在C#中將枚舉強制轉換爲int時,發生了什麼?
- 8. 當我壓縮CouchDB數據庫時實際發生了什麼?
- 9. 在Matlab中將數字轉換爲實際時間字符串
- 10. 當我將uint8_t數組轉換爲uint32_t時會發生什麼?
- 11. 爲什麼在JSON字符串中將double轉換爲int
- 12. 爲什麼不正確(parseInt)將字符串轉換爲int?
- 13. 我需要將字符串日期轉換爲實際日期
- 14. 轉換INT [] []將字符串
- 15. 將unicode轉換爲實際字符C#
- 16. 將字節轉換爲實際字節類型的字符串
- 17. JQuery.each將字符串文字轉換爲字符串。爲什麼?
- 18. 當一個短int []自動轉換爲long int []時會發生什麼?
- 19. 當比較一個字符串和一個int時,將它們轉換爲字符串vs將它們轉換爲int類型有什麼區別?
- 20. lwz實際發生了什麼?
- 21. IQueryable.Where()實際發生了什麼?
- 22. 將字符串轉換爲int數組
- 23. 將字符串轉換爲int []
- 24. 將字符串轉換爲空值int
- 25. 將字符串轉換爲int陣列
- 26. 如何將字符串轉換爲int
- 27. 如何將字符串轉換爲Int?
- 28. 如何將字符串轉換爲int?
- 29. 將字符串轉換爲int在C++
- 30. SSRS將Int轉換爲字符串
我對_ _ str _ _方法背後的實際魔術感興趣,特別是使用內置的int對象。當我調用str(6)時,int對象如何使用_ _ str _ _返回數字6的字符串表示形式? –