您好,登錄后才能下訂單哦!
本篇內容主要講解“Python賦值一切對象皆傳址怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python賦值一切對象皆傳址怎么理解”吧!
Python賦值一切對象皆傳址 經常聽到編程語言賦值操作中,有傳引用,傳值等傳遞方式,但在Python中只有傳地址唯一一種方式。舉個例子:
>>> s = [1,2,3] >>> t = s >>> t.reverse()
s 和 t的值都變成了[3,2,1],再看:
>>> s = [1,2,3] >>> t = s[::-1]
s的值是[1,2,3],t的值是[3,2,1],那么問題來了,Python中賦值操作是傳值還是傳地址?
Python一切皆為對象。賦值一直都是傳址。所有變量都是保存著對象的地址。上例子中的第一種情況將s賦值給了t,此時s和t指向了同一個對象。所以執行reverse時,對象本身被改變。因為s和t指向同一個對象,所以你無論輸出s還是t都是輸出同一個已經被reverse的對象。 第二種情況是對s執行了一個切片(slicing)的操作。此時本身s[::-1]返回的不是s指向的那個對象本身,而是一個在內存中根據運算重新生成的對象,所以t指向的是一個s[::-1]生成的新對象的地址。而s還是指向著原來的對象,由于s[::-1]不會改變原來對象的值,所以s的值是不會改變的。
延伸閱讀:
在Python中,即使是整數類型,它也是按照對象來處理的。例如a=1,它并不是將1值賦值給了a,而是將一個整數對象1的地址賦值給了a。由于Python對小整數的特殊處理,凡是在一定范圍內的小整數,是統一使用了“小整數對象池”。也就是說所有的小整數,例如1,都是使用對象池里面的同一個對象。但是,小整數對象池是有限的,范圍是[-5, 257) 注意左閉右開。所以,超過這個范圍的整數,嚴格來說,是需要生成這樣的一個對象的。所以,就會出現下面的情況
>>> a = 1 >>> b = 1 >>> id(a) == id(b) True >>> c = 1000000 >>> d = 1000000 >>> id(c) == id(d) False
而整數對象是一種不可變類型,也就是說,一旦你生成了一個257的整形對象,你這個對象保存的數字就是不能再變化的了。那么我們對整數執行加法的時候,得到的結果和原來的對象是什么關系呢?答案是,沒關系,結果是根據求和數值產生的一個全新的對象。即使全新的對象和原來數值一樣,也是不同的對象(除非數字在小整數對象池內)。例如:
>>> e = c + 0 >>> id(c) == id(e) False >>> f = a + 0 >>> id(a) == id(f) True
而列表類型是一種可變類型。他提供了一些原地改變對象而不用生成新對象的方法,例如s.reverse()。但同時,也可以生成一個新的對象儲存想要的結果,例如s[::-1],或者reversed(s)。PS:注意reverse()和reversed的區別
到此,相信大家對“Python賦值一切對象皆傳址怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。