<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在python中,判斷兩個變數是否相等或一樣,可以使用==或者is來判斷;判斷不一樣可以使用 is not。
範例
如果兩個字串末尾有其他符號,比如回車‘n',print的時候無法發現的,所以需要strip:
a=a.strip() b=b.strip() if a==b: print "True"
這是因為兩個字串來自不同的記憶體塊,記憶體地址不一樣
id() 函數用於獲取物件的記憶體地址。
(ob1 is ob2) 等價於 (id(ob1) == id(ob2)) id函數可以獲得物件的記憶體地址,如果兩個物件的記憶體地址是一樣的,那麼這兩個物件肯定是一個物件。和is是等價的.
原理比較複雜,如下:
In [1]: def bar(self, x): ...: return self.x + y ...: In [2]: class Foo(object): ...: x = 9 ...: def __init__(self ,x): ...: self.x = x ...: bar = bar ...: In [3]: foo = Foo(5) In [4]: foo.bar is Foo.bar Out[4]: False In [5]: id(foo.bar) == id(Foo.bar) Out[5]: True
真實情況是當執行.操作符的時候,實際是生成了一個proxy物件,foo.bar is Foo.bar的時候,兩個物件順序生成,放在棧裡相比較,由於地址不同肯定是False,但是id(foo.bar) ==id(Foo.bar)的時候就不同了,首先生成foo.bar,然後計算foo.bar的地址,計算完之後foo.bar的地址之後,就沒有任何物件指向foo.bar了,所以foo.bar物件就會被釋放。然後生成Foo.bar物件,由於foo.bar和Foo.bar所佔用的記憶體大小是一樣的,所以又恰好重用了原先foo.bar的記憶體地址,所以id(foo.bar) == id(Foo.bar)的結果是True。
下面內容由郵件Leo Jay大牛提供,他解釋的更加通透。
用id(expression a) == id(expression b)來判斷兩個表示式的結果是不是同一個物件的想法是有問題的。
foo.bar 這種形式叫 attribute reference [1],它是表示式的一種。foo是一個instance object,bar是一個方法,這個時候表示式foo.bar返回的結果叫method object [2]。
根據檔案:
When an instance attribute is referenced that isn't a data attribute, its class is searched. If the name denotes a valid class attribute that is a function object, a method object is created by packing (pointers to) the instance object and the function object just found together in an abstract object: this is the method object.
foo.bar本身並不是簡單的名字,而是表示式的計算結果,是一個 method object,在id(foo.bar)這樣的表示式裡,method object只是一個臨時的中間變數而已,對臨時的中間變數做id是沒有意義的。
一個更明顯的例子是,
print id(foo.bar) == id(foo.__init__) 輸出的結果也是True
看 id 的檔案[3]:
Return the 「identity」 of an object. This is an integer (or long 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. CPython implementation detail: This is the address of the object in memory.
只有你能保證物件不會被銷燬的前提下,你才能用 id 來比較兩個物件。所以,如果你非要比的話,得這樣寫:
fb = foo.bar Fb = Foo.bar print id(fb) == id(Fb)
即把兩個表示式的結果繫結到名字上,再來比是不是同一個物件,你才能得到正確的結果。
is表示式 [4] 也是一樣的,你現在得到了正確的結果,完全是因為 CPython 現在的實現細節決定的。
現在的is的實現,是左右兩邊的物件都計算出來,然後再比較這兩個物件的地址是否一樣。
萬一哪天改成了,先算左邊,儲存地址,把左邊釋放掉,再算右邊,再比較的話,你的is的結果可能就錯了。
官方檔案裡也提到了這個問題 [5]。
我認為正確的方法也是像id那樣,先把左右兩邊都計算下來,並顯式繫結到各自的名字上,然後再用is判斷。
cmp() 函數則是相當於 <,==,> 但是在 Python3 中,cmp() 函數被移除了,所以我以後還是避免少用這個函數。
#-*-conding:utf-8-*- i='新聞'; m=input(); if i==m: print('yes'); else: print('no'); input();
if second_company_name == u'中外運長航' or second_company_name == u'長航集團': print(u'忽略中外運長航和長航集團的子公司') continue
在 if 判斷語句中非常有用吶!
#!/usr/bin/python # Filename: if.py number = 23 guess = int(raw_input('Enter an integer : ')) if guess == number: print 'Congratulations, you guessed it.' # New block starts here print "(but you do not win any prizes!)" # New block ends here elif guess < number: print 'No, it is a little higher than that' # Another block # You can do whatever you want in a block ... else: print 'No, it is a little lower than that' # you must have guess > number to reach here print 'Done' # This last statement is always executed, after the if statement is executed``` ## strip 去掉字串其他符號 str1 = str1.strip() #去掉字串中其他符號包括換行符等等 str2 = str2.strip() if str2 == str1: ... #自己的程式碼 ## == 與 is的區別
python中,使用==來比較兩個**物件的值**是否相等,而java 則使用== 比較兩個**物件**是否是同一物件
譬如,java中比較字串,一般使用equal 方法,來比較兩個物件的值是否相等,而不使用==
相比較的,python 使用**is** 來比較兩個物件是否是同一物件。
is 用來判斷是否是同一個物件,is 是種很特殊的語法,你在其它的語言應該不會見到這樣的用法。
官方檔案解釋:
```python The operators ``is`` and ``is not`` test for object identity: ``x is y`` is true if and only if *x* and *y* are the same object. ``x is not y`` yields the inverse truth value. cmp(...) cmp(x, y) -> integer Return negative if x<y, zero if x==y, positive if x>y.
>>> a='abc' >>> b='abc' >>> a is b True >>> id(a) == id(b) True >>> >``` (Java 中直接賦值的字串也可用 == 來判斷,但是使用 new 範例化的物件則需要使用equals(String s) 來判斷) ## 判斷數位相等不要用 is 操作符 ```python >>> a = 256 >>> b = 256 >>> id(a) 9987148 >>> id(b) 9987148 >>> a = 257 >>> b = 257 >>> id(a) 11662816 >>> id(b) 11662828
為什麼兩次 is 返回的是不同結果?不是應該都是 true 嗎?
因為 string pooling (或叫intern)。 is 相等代表兩個物件的 id 相同(從底層來看的話,可以看作參照同一塊記憶體區域)。 至於為什麼 「ABC」 被 intern 了而 「a bc」 沒有,這是 Python 解析器實現決定的,可能會變。
== 用來判斷兩個物件的值是否相等(跟 Java 不同,Java 中 == 用來判斷是否是同一個物件)。
今天我用 == 來判斷兩個 IP 地址 字串是否相同。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45