上一篇筆記講到globals老是固定指向模塊名字空間,而locals則指向當前做用域環境python
在初步瞭解後,咱們甚至能夠直接修更名字空間來創建關聯引用,這與傳統變量定義方式有所不一樣數組
並不是全部時候都能直接操做名字空間,函數執行使用緩存機制,直接修改本地名字控件未必有效,在正常編碼時,應儘量的避免直接修更名字空間緩存
在名字空間裏,名字只是簡單字符串主鍵,其自身數據結構裏沒有任何目標對象信息,經過名字訪問目標對象的本質就是以名字做爲主鍵去字典裏讀取目標對象指針引用。也正由於如此,名字能夠從新關聯另外一個對象,徹底不在意其類型是否與前任相同數據結構
賦值操做僅是讓名字在名字空間裏從新關聯,而非修改原對象函數
和一個名字只能引用一個對象不一樣,單個對象能夠同時有多個名字,不管是在相同或不一樣的名字空間裏編碼
必須使用is判斷兩個名字是否引用同一對象,相等操做符並不能肯定兩個名字指向同一個對象,這涉及操做符重載,或僅用來比較值是否相等spa
理解方式:python中一次聲明建立一個對象,1234被聲明瞭兩次,因此是不一樣的對象,擁有不一樣的id值,is是判斷id值是否相同的,因此返回false,==是判斷值是否相同,因此返回的是true.net
補充:3d
以下圖所示,x和y值相同,且值爲一個較小的值時,x is y被判斷爲true指針
引用
https://blog.csdn.net/xiongchengluo1129/article/details/78770177?utm_source=blogxgwz2
int清楚寫了[-5, 256] 這些小整數被定義在了這個對象池裏.因此當引用小整數時會自動引用整數對象池裏的對象的. string對象也是不可變對象,python有個intern機制,簡單說就是維護一個字典,這個字典維護已經建立字符串(key)和它的字符串對象的地址(value),每次建立字符串對象都會和這個字典比較,沒有就建立,重複了就用指針進行引用就能夠了. string實現了intern共享?我以爲是一種空間效率和時間效率的妥協。相比於數字,string自己參與的運算要少不少,並且string自己佔據的空間也大許多,所以string的主要問題在於不共享帶來的空間浪費,因此string實現了很費時間的intern操做。對於數字狀況正好相反。做爲一個數字,須要作的運算要比string多太多了,並且大小比string也小不少。若是在計算10000+20000以前先花很久查找重複對象,致使一個1ms完成的加法花了100ms,我確定想砸電腦的。 float類型能夠認爲每一個賦值都是建立一個對象,由於float有點多,因此不必和int同樣了. tuple它是不可變對象,理應和int和string同樣會作一個緩存,可是書上沒有說明,因而看了看源碼,發現tuple的數據結構很簡單,簡單到不能再簡單,就是一個數組,裏面是元組的迭代對象,這個對象指向的是各個元素.最關鍵的是元組沒有實現intern機制!因此元組雖然是不可變對象,但它同時也是一個數組,這個數組和c裏的數組同樣,每次建立都會分配內存空間。
因此上述代碼中,由於123在這個小整數對象池裏,因此兩次申明其實指向了同一個對象,此時x和y擁有了同一個id值,因此此時 x is y被斷定爲true
總結:
Python中的對象包含三要素:id、type、value
其中id用來惟一標識一個對象
type標識對象的類型
value是對象的值
is判斷的是a對象是否就是b對象,是經過id來判斷的
==判斷的是a對象的值是否和b對象的值相等,是經過value來判斷的