python賦值與變量誤區,is 和 == 的陷阱

很多時候,對變量的賦值容易產生誤區,如果對其理解的不透徹,會對程序產生意想不到的效果。。。
 
在python中,對於不可變變量與可變變量的賦值,是不一樣的,比如b=a,就是將a的地址索引傳遞給b,b和a其實指向同一個對象。如果這個對象是可變的,那麼a和b任何一個變量發生修改,另外一個變量也隨之修改。
 
但對不可變變量,如果在代碼中第一次聲明,如a = 500,則不一樣。它將新開闢了一塊地址,並將這個地址綁定給這個變量a,如果再次有變量獲得這個相同的值,但這個地址將是固定的!也就是說如果再使得c=500,那麼c也會獲得這個地址,它將和a指向同一個變量,這是python本身節約內存的一種方法。
 
然而這種聲明只針對字符串和數字等不可變變量有效,針對列表或元組之類將無法產生效果。
 
比如:A = [1,3,5]   B=[1,3,5],那麼他們兩個的地址將是不同的!因爲python內部代碼中,每次聲明列表等可變變量,都會開闢一塊新的地址,並將其賦值於變量。
這麼做的原因其實也很好理解,比如A = [1,3,5] ,B=A,那麼A.append(3),B也會發生變化,符合邏輯,但如果A = [1,3,5] , B=[1,3,5],如果像不可變變量一樣分配相同的地址,那麼 A.append(3)將會使得B的列表值也發生改變!這將在邏輯上產生嚴重的錯誤。
 
而不可變變量,是無法對其進行修改的,其值將是固定的,每次爲其賦新值只是重新分配值而已,而不是在原有值的基礎上修改值,所以每次爲其新開闢地址,在邏輯上就不會錯誤了。
 
但對於不可變變量,如果這個值事先被聲明過,但另外一個相同的值是從其他地方獲取的並賦值給一個變量的,比如爬取,那麼這個值將不會和原始聲明的相同值分配相同的地址!
 
比如從爬取網頁上的500這個值並將其賦值給data,並且你也事先聲明過c=500,但其兩個相同值的地址將不同!這時如果使用is判斷,會獲得一個錯誤的返回值,而使用==判斷,會獲得一個正確的返回值。

 

 

發佈了13 篇原創文章 · 獲贊 17 · 訪問量 5410
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章