你想了解Python中的==和IS其他?
前言
比較物件值時使用 == 等邏輯操作符,比較的是物件的值;比較物件身份時使用 is 和 is not 操作符,比較的是物件的本身,即可理解為物件的地址,該地址可以由id()函式獲得。
理解過程中可以類比 C 語言中變數的比較,例如對於變數 a 和 b,比較值相當於 a == b,比較身份相當於 &a == &b,即對兩個變數分別取地址,之後比較這兩個地址。
Python 中使用大量使用引用賦值。通過 b = a 的操作,C 語言中是將 a 的值賦給 b,兩個變數的地址不同;Python 中則通過引用賦值,直接使 b 和 a 指向相同的地址,這樣就可以複用記憶體,使得儲存更高效。
不過在使用過程中,對於不可改變型別,或者表述為“標量儲存型別”,這個操作對於使用者是透明的,即對於使用者來說相當於普通複製賦值,如下。使用 b = a 賦值後,可以看到,兩個變數的 id 是相同的,即記憶體中地址相同。改變 b 的值後可以看到,系統自動給 b 分配了新的地址空間,改變 b 並沒有引起 a 的改變。
>>> a = 1
>>> b = a
>>> id(a)
29667592L
>>> id(b)
29667592L
>>> b += 1
>>> a
1
>>> b
2
>>> id(a)
29667592L
>>> id(b)
29667568L
對於可變型別,Python 真的是使用引用賦值,如下。可以發現對於 list 型別,改變了 b 的值後 a 也隨之改變,兩個變數的地址是相同的。
>>> a = [1, 2]
>>> b = a
>>> id(a)
34412232L
>>> id(b)
34412232L
>>> b += [3]
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> id(a)
34412232L
>>> id(b)
34412232L
若需要對於 list 型別使用複製賦值,需要使用技巧 b = a[:],此時系統會為 b 分配新的地址,並賦予之一份 a 的拷貝,如下。
>>> a = [1, 2]
>>> b = a[:]
>>> a
[1, 2]
>>> b
[1, 2]
>>> id(a)
34520264L
>>> id(b)
34520456L
>>> b += [3]
>>> a
[1, 2]
>>> b
[1, 2, 3]
>>> id(a)
34520264L
>>> id(b)
34520456L
Python 中對於記憶體的管理是自動的,不需要程式猿參與。系統對於每個變數的記憶體空間新增了一個計數器,沒增加一個引用,即有新的指標指向這個地址時,就對計數器加一,反之減一。當計數器的值為 0 時,系統回收這塊記憶體。當使用 del 操作時,直接將該變數所在記憶體的計數器置為 0,即直接刪除之。
這種管理方式在 Linux/Unix 的檔案系統中也在使用,*nix 系統採用 inode 格式來管理檔案。這種管理方式採用唯一的 id 來標識檔案,而檔名只是一個普通屬性,因此可以在檔案開啟過程中修改檔名。每當對於檔案建立一個新的硬連結,系統就會將檔案的計數器加一,當計數器的值為 0 時,表示檔案被刪除。
小編推薦一個學python的學習qun 740322234
無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多幹貨和技術資料分享!
相關文章
- 你想了解的Promise,都在這裡!!Promise
- 你想了解的「SpringCloud」都在這裡SpringGCCloud
- 中級通訊工程師考試,你想了解的都在這裡工程師
- 關於資料探勘你想了解的都在這
- 你想了解的JDK 10版本更新都在這裡JDK
- Cloutflare:TLS 1.3解讀 你想了解的都在這兒TLS
- 關於移動遊戲SDK,你想了解的都在這裡遊戲
- 關於大屏視覺化,你想了解的都在這視覺化
- 你想了解的DDS協議解決方案在這裡協議
- 深入剖析Vue原始碼 - Vue插槽,你想了解的都在這裡!Vue原始碼
- 你想要了解GO語言嗎?帶你入門!Go
- 關於工商詳細資訊 API,你想了解的都在這裡了API
- 大家都來說說jivejdon和jdonFramework中你想加入的功能Framework
- 零基礎的UI設計入門,你想了解的都在這兒UI
- Win10釋出在即 你想了解的內容都在這裡了Win10
- Python和其他流行的程式語言有什麼區別?Python
- 資料分析師必看!關於大屏視覺化你想了解的都在這~視覺化
- SQLAlchemy 和其他的 ORM 框架SQLORM框架
- 這一千個Python庫,總有你想要的!Python
- Python 中的 is 和 idPython
- SaaS行業持續升溫,這裡有你想了解的SaaS雲服務優勢行業
- Linux C++ 開發7 - GDB常用命令彙總(你想了解的都在這)LinuxC++
- 『無為則無心』Python序列 — 19、Python列表的其他操作(切片和遍歷)Python
- Java和Python哪個更好?解讀Python對比其他語言的優勢JavaPython
- Python學習之Django和其他Python框架有什麼區別?PythonDjango框架
- html中的其他的常用標籤HTML
- Python中的類和物件(中級)Python物件
- Excel 中的 VLOOKUP 函式,沒你想的那麼難Excel函式
- Python 中 is 和 == 的區別Python
- Python中is和==的區別Python
- python 中的*args 和**kwargsPython
- 你擁有的知識比你想象中更有意義和價值
- Python超程式設計:控制你想控制的一切Python程式設計
- 【譯】Flutter 1.17 | 2020年度第一個穩定版本,你想了解什麼?Flutter
- Python和Java、PHP、C、C#、C++等其他語言的對比?PythonJavaPHPC#C++
- Python 字元編碼問題和其他一些問題Python字元
- Mybatis和其他主流框架的整合使用MyBatis框架
- Python面試大全–所有你想到的,想不到的全在這裡!Python面試