在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能  Python/ python input 獲取到的字符串不能使用is 判斷

python input 獲取到的字符串不能使用is 判斷

test = input('TT >>').strip()
print(type(test))
print(type('TT'))
print(id(test))
print(id('TT'))

if test is "TT":
    print('Yes')

上面的代碼運(yùn)行后,結(jié)果為

TT >>TT
<class 'str'>
<class 'str'>
4364442848
4364036392

我在輸入那里寫了字符串'TT',按道理變量這里獲取到的就是字符串'TT',python的字符串類型是不可變,為什么我這里得到的 id 卻不相同?

另一端測(cè)試代碼

tt2 = 'TT'
tt3 = 'TT'
print(id(tt2))
print(id(tt3))

得到結(jié)果:

4314464360
4314464360

這里的id 就相同,難道input函數(shù)得到的返回值和這樣直接賦值字符串有所不同嗎?

環(huán)境是MAC下運(yùn)行python3

回答
編輯回答
悶油瓶

==和is如何選擇?

==運(yùn)算符比較兩個(gè)對(duì)象的值,可以使用__eq__魔術(shù)方法重載實(shí)現(xiàn)自定義比較。
is比較兩個(gè)對(duì)象的id標(biāo)識(shí),不能重載,通常用于變量和單例值直接的比較,比如is None。

為什么有時(shí)id相同?

首先id并不會(huì)因?yàn)槭遣豢勺冾愋途拖嗤?br>Cpython有一種叫駐留(interning)的細(xì)節(jié)優(yōu)化手段,會(huì)為字符串還有小的整數(shù)做出優(yōu)化,共享同一個(gè)引用。
但是注意這種優(yōu)化既不適用不可變類型,也不適用所有的字符串和整數(shù),具體情況參考源碼實(shí)現(xiàn)。

2017年3月11日 23:57
編輯回答
妖妖

根據(jù) python 官方文檔, id() 函數(shù)解釋如下

In [1]: id?
Signature: id(obj, /)
Docstring:
Return the identity of an object.

This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
Type:      builtin_function_or_method

input() 函數(shù)返回的是動(dòng)態(tài)創(chuàng)建的字符串,它的內(nèi)存地址不是預(yù)知的。
tt2 = 'TT'; tt3 = 'TT'; 這種, python 解釋器只會(huì)保存第一個(gè) ‘TT’ 字符串,第二個(gè) ‘TT’ 被引向前面那個(gè)。因此它們的 id() 結(jié)果相同。改變 tt2tt3 將導(dǎo)致新的字符串產(chǎn)生,而不會(huì)改變 ‘TT’ 內(nèi)容。

2018年9月22日 10:50
編輯回答
瞄小懶

這個(gè)問題看似簡(jiǎn)單,但是卻觸及到了計(jì)算機(jī)的底層?。?!

根據(jù)《深入理解計(jì)算機(jī)系統(tǒng)》這本書的第一章節(jié)所提:信息 就是位 + 上下文。

圖片描述

那么,我們看看 Python 是 如何對(duì) id() 函數(shù)定義的:

>>>help(id)
Help on built-in function id in module builtins:

id(obj, /)
    Return the identity of an object.

    This is guaranteed to be unique among simultaneously existing objects.
    (CPython uses the object's memory address.)
(END)

顯而易見,id(object) 函數(shù)是返回對(duì)象 object 位于內(nèi)存中的地址。
但是,根據(jù)《深入理解計(jì)算機(jī)系統(tǒng)》對(duì) 信息 的定義, 你會(huì)認(rèn)識(shí)到 python 文檔一貫輕佻的調(diào)性,這里沒有提 上下文, 沒有提對(duì)象的生命周期,這是不嚴(yán)謹(jǐn)?shù)?。因?yàn)闆]有提到重要的上下文關(guān)系。

為了更好的理解,特別是 生命周期,也就是上下文關(guān)系,

我做了兩個(gè)腳本:

test1.py 內(nèi)容如下:

print(__name__)
test1 = input('ttt>>>').strip()
print(test1)
print(id(test1))


test2 = 'TT'
print(id(test2))

test2.py 內(nèi)容如下:

test3 = 'TT'
print(__name__)
print(id(test3))

運(yùn)行第一個(gè)腳本,顯示主程是 __main__,結(jié)果,你會(huì)發(fā)現(xiàn)和題主的腳本是一樣的,兩個(gè) id 是不一樣的。
運(yùn)行第二個(gè)腳本,顯示主程是 __main__,結(jié)果,你會(huì)發(fā)現(xiàn)這里的 id 和第一也是不一樣的。

也就是說,對(duì)象的對(duì)應(yīng)的 內(nèi)存地址 是不一樣的,因?yàn)椋?strong>上下文 ,或者說程序的生命周期不一樣。

更直觀點(diǎn),你運(yùn)行第一個(gè)腳本很多遍,每次 id 顯示的內(nèi)容幾乎都是不一樣的。
運(yùn)行第二個(gè)腳本也是如此。
至于為什么我用 幾乎這個(gè)詞,還是留給你們自行查資料把。

2017年10月9日 23:55
編輯回答
瘋浪
>>> test = input('TT>>')
TT>>'TT'
>>> test2 = 'TT'
>>> id(test)
4401760416
>>> id(test2)
4401760416

以上是在Python2環(huán)境下的執(zhí)行結(jié)果。二者id是相同的。
所以,題主真正需要了解的應(yīng)該是python2和python3環(huán)境下,input的區(qū)別。

2018年2月7日 10:06