python小白一枚問一個我比較在意的問題。我在python3.8.2里查看字串代碼是這樣子的結果
>>> id('cpccp')
4300388336
>>> id('oee8ed.')
4300388336
但是在3.7里不是這樣了
id('cpccp')
4368612352
id('oee8ed')
4370164792
為什么在3.8里面不同的字串地址一樣,而在3.7里面地址會不一樣,請問有大神能夠幫忙解決嗎,好像到處也沒人問這個問題的,我就來這里看看。
但是好像也有一樣的點,如下>>> a='apple'
>>> b='basket'
>>> a+b is 'applebasket'#不管是a+b還是a+'basket'都是false
<stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
False
>>> id(a+b)
4300389360
>>> id('apple'+b)#輸出地址都一樣
4300389360
>>> id('apple'+'basket')
4300389360
=================================================
a='apple'#python3.7
b='basket'
a+b is 'applebasket'
False
id(a+b)
4369049264#和下面的地址不一樣
id(a+'basket')
4366530480
如上,如能解決萬分感謝
uj5u.com熱心網友回復:
首先,python的 id 函式 和 C語言中的 取地址操作 & 類似,但也有些不同:C語言 的 & 操作是真實取得一個記憶體地址或者虛擬頁面記憶體的地址,回傳的是地址值,是有真實地址對應的。
而 python 的 id() 函式只是分配給每一個物件的唯一的一個固定不變的整數值。
看官方檔案:
“ id(object) :
Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value."
---- 引自 python.org
就是說得到的并不是一個地址,而是一個唯一的固定的整數值.
而且: 兩個不同的沒有重疊的生命周期的物件 (two objects with non-overlapping lifetimes )
可能有 同樣的 id值( may have the same id() value)
1.
這就解釋了 你的第一個問題:
在命令列下, id('abcd') 后又運行 id('123') 可能有同一個值,因為第一個值的生命周期已經結束,然后再啟動的第二個值,所以id可以相同啊。
可以形象地理解為: 在黑板某一個位置寫了一行字,擦掉后再在同一個位置寫另外的字,位置相同字不同,是一個道理。
至于 版本問題,3.8, 3.7的不同,只是不同版本編譯系統的差異,不影響對 id() 函式的定義。
2.
python中有一個重要概念: 字串是固定的,不能更改的。這和C語言是不同的。
所以: python中,如果兩個字串相同,他們可以有同一個id (python先查有沒有相同的字串,有就用現成的),也可以不同
而不同的字串,他們一定有不同的id
>>> x = 'abcd'
>>> y = '123'
>>> z = 'abcd'
>>> id(x)
69937312
>>> id(z)
69937312
>>> id(y)
69937408
這解釋了你的第二個問題。
當然,版本不同,編譯可能略有差別。
個人拙見,參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218753.html
上一篇:請教一下lua時間問題
下一篇:《Python專案開發案例集錦》
