1. 程式人生 > 其它 >Python 零散知識點 Python 全域性變數 global Python 3 assert(斷言)

Python 零散知識點 Python 全域性變數 global Python 3 assert(斷言)

Python 全域性變數 global

Python 3 assert(斷言)

 

Python is 與 == 區別

在 Python 中一切都是物件,物件之間比較是否相等可以用==,也可以用is。==和is操作的區別是:

is

比較的是兩個物件的id值是否相等,也就是比較倆物件是否為同一個例項物件,是否指向同一個記憶體地址。

==

比較的是兩個物件的內容是否相等,預設會呼叫物件的__eq__()方法。

 

使用is注意python關於字串的intern機制儲存
    注意python中建立兩個內容一樣的變數時(變數名不一樣),一般都會在記憶體中分配兩個記憶體地址分別給這兩個變數。即兩個變數的內容雖然樣,但是變數的引用地址不一樣。所以兩個變數使用==比較成立,但是使用 is比較不成立。

但是在python中有兩個意外情況:
1.使用python命令列時對於小整數[-5,256]區間內的整數,python會建立小整數物件池,這些物件一旦建立,就不會回收,所有新建立的在這個範圍的整數都是直接引用他即可。所以造成在[-5,256]區間內的整數不同變數只要值相同,引用地址也相同。此範圍外的整數同樣遵循新建一個變數賦予一個地址。

2.python中雖然字串物件也是不可變物件,但python有個intern機制,簡單說就是維護一個字典,這個字典維護已經建立字串(key)和它的字串物件的地址(value),每次建立字串物件都會和這個字典比較,沒有就建立,重複了就用指標進行引用就可以了。相當於python對於字串也是採用了物件池原理。(但是注意:如果字串(含有空格),不可修改,沒開啟intern機制,不共用物件。比如"a b"和"a b",這種情況使用is不成立的形式 只有在命令列中可以。使用pycharm同樣是True,因為做了優化)

 

 

Python3 中的nonlocal用法

count = 1

def a():
    count = 'a函式裡面'    #如果不事先宣告,那麼函式b中的nonlocal就會報錯
    def b():
        nonlocal count
        print(count)
        count = 2
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)

執行結果是:

a函式裡面
2
1

 

python物件池


python中,一切皆為物件
id方法的返回值就是物件的記憶體地址。
is運算子,如果引用的是同一個物件則返回true,x is y類似 id(x) == id(y)

小整數物件池
[-5, 256] 這些小整數被定義在了一個整數物件池裡,當引用小整數時會自動引用整數物件池裡的物件,所以這些小整數不會重複建立,當多個變數指向同一個小整數時,實質上它們指向的是同一個物件。
字串
字串物件是不可變物件,python有個intern機制,簡單說就是維護一個字典,這個字典維護已經建立字串(key)和它的字串物件的地址(value),每次建立字串物件都會和這個字典比較,沒有就建立,重複了就用指標進行引用就可以了。intern機制處理字串長度小於等於20且僅由數字字母下劃線構成的,只建立一次。
浮點型
float型別可以認為每個賦值都是建立一個物件,因為float值很多
元組
tuple它是不可變物件,可能是因為查詢開銷太大,沒有實現intern機制,其實就是一個數組,這個陣列和c裡的陣列一樣,每次建立都會分配記憶體空間
常量池


在同一個編譯單元(PyFunctionObject)裡出現的值相同的常量,只會在常量池裡出現一份。常量包括大整數,浮點數,字串。

巢狀函式:

python允許建立巢狀函式。也就是說我們可以在函式裡面定義函式,而且現有的作用域和變數生存週期依舊不變。

例子:

def outer():
    name="python"

    def inner():#outer函式內部定義的函式
        print(name)
    return inner()#返回該內部函式

outer()

 

 

 

 

REF

https://blog.csdn.net/qq_26442553/article/details/82195061

https://www.cnblogs.com/liyang93/p/6669874.html

https://blog.csdn.net/xingjingb/article/details/81084438