2017-07-02 13 views
3

在Python中,每個整數似乎都有一個從438開始的10位數的id。我試圖找到一個與id相同的數字。我寫了一個簡單的代碼來找到該號碼:每當我嘗試運行該程序時,都會改變它的id號碼嗎?

for i in range(4380000000,4390000000): 
    if i==id(i): 
     print(i) 
    else: 
     pass 

當我第一次運行這個時,我沒有這樣的號碼。然後我第二次運行它,但仍然沒有編號。

當我跑了第三次,我得到了一個號碼:4384404848

然後我檢查是否id(4384404848)==4384404848和我False

爲什麼Python返回一個不等於它的id的數字?或者當程序運行和停止時,同一個號碼是否有不同的ID?

(編輯:假設「每個整數似乎已經從438開始的10位ID」是錯誤的。)

回答

4

https://docs.python.org/2/library/functions.html#id

保證是此對象的獨特和不斷在其一生中。

將id視爲爲此對象計算的唯一標識符或「散列」。它可能(並且很可能會)每次運行程序時都會有所不同。

編輯:只需添加,如果您使用CPython實現(這是最流行的),那麼它就是內存中對象的地址。這應該闡明爲什麼在同一計劃的不同運行中它不一樣。作爲一個單獨的註釋,你不應該依賴於id()在任何對象上的值,而不是它在給定運行時的唯一性。

每個整數似乎有它開始從438

是一個不正確的假設一個10位數字的ID。在我的機器:

>>> x = 5 
>>> id(x) 
38888712L 
+0

我不認爲這是真的。如果我輸入'id(2)',我會得到'4297636384'。現在,如果我退出Python並再次輸入'id(2)',我會得到相同的編號。 –

+1

@AaryanDewan這是因爲CPython中的小整數 - 特別是範圍在'-5'到'256' - 被緩存。所以'2'的id認爲每個程序都會指向在程序啓動之前創建的同一個'2' CPython。 –

+1

如果您好奇,請點擊以下鏈接:[Python 3 Docs](https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong)。 請注意提到的部分:'當前實現爲-5到256之間的所有整數保留一個整型對象數組,當您在該範圍內創建一個int時,您實際上只返回對現有對象的引用' –

2

NO

它並不總是以438

你應該把它像一個大學生或員工ID號的唯一的註冊號碼號(但對於Python對象)

看什麼文檔說

id(對象)

返回對象的「身份」。這是一個整數,它在其生命週期中保證對這個對象唯一且恆定。具有非重疊生命週期的兩個對象可能具有相同的id()值。

CPython實現細節:這是內存中對象的地址。

說清楚。我假設你知道,無論你創建多少變量,如果他們持有相同的值然後在Python中,他們都是一樣的。 (別名

看看翻譯。

>>> a=10 
>>> id(10) 
26775680 
>>> b=20 
>>> id(20) 
26775440 

獨特的權利。現在來看,

>>> a=10 
>>> b=10 
>>> id(a) 
26775680 
>>> id(b) 
26775680 

也期待,

>>> a=10 
>>> id(a) 
26775680 
>>> a=20 
>>> b=a 
>>> id(a) 
26775440 
>>> id(b) 
26775440 

所以每(對象)被分配一個獨特的價值。而這個價值只不過是你的id()

由於OP詢問!

Python的實現。

含義:的Python

的「實施」應被認爲是指一程序或環境,其提供支持的寫在Python語言程序的執行,如由CPython的參考實現表示。

那麼這意味着什麼是CPython的是塔語言引擎它運行Python代碼(語言)。爲什麼它被命名爲Cpython?區分Python(語言)和Cpython(實現)。

所以基本上CPython的是其中一個最常用的Python實現(CPython的:用C寫的,常常被簡稱爲「Python的)您在python.org上下載的一個是這樣的一個

你需要區分語言和實現。 Python是一種語言。

根據維基百科,

「A編程語言編寫程序,這是一個計算或算法規格的符號」。

這意味着它只是編寫代碼的規則和語法。另外我們有一個

編程語言實現 在大多數情況下,它是實際的解釋器或編譯器。

因此CPython的 - 在C

實施有Jython的 - 實現在Java中

IronPython的 - 在C#中

和其他的一些實現。看看他們在這裏Implementations。下載並混淆他們以瞭解更多信息。

+0

謝謝!你可以告訴我什麼是「CPython實現」嗎? –

+1

@AaryanDewan CPython是用C編程語言編寫的Python的默認實現,它是你從[python.org](https:// www。 python.org/)。我們說「CPython」,因爲它不是Python的唯一實現。有一些例如[PyPy](https://pypy.org/)或[IronPython](http:// ironpython)。 net /)當我們說「實現」時,我們指的是用某種語言編寫的解釋器,它可以執行有效的Python代碼。 –

-1

根據官方文檔:

返回的對象的「身份」。這是一個整數(或長整數),在整個生命週期中保證這個對象是唯一的並且是常量。具有非重疊生命週期的兩個對象可能具有相同的id()值。

所以,從本質上講,在Python任何對象的ID的哈希值,它是獨一無二的爲它的生命週期

爲什麼Python返回一個不等於它的id的數字?或者當程序運行和停止時,同一個號碼是否有不同的ID?

您發現'i'的散列值爲4384404848,但將它與字面值'4384404848'的散列值進行比較。根據定義,它們必須有所不同。

相關問題