動態型別詳解

2021-07-10 19:06:01 字數 1826 閱讀 5132

#-*-coding:utf-8-*-

'''created on 2023年3月27日

@author: zroad

'''#動態型別:型別是在執行過程中自動決定的,而不是通過**宣告

"""一、動態語言賦值的操作過程,以 a = 3為例,分三步完成:

1、建立乙個物件來代表值3。

2、建立乙個變數a,如果它還未建立的話

3、將變數與新的物件3連線起來

""""""

二、關於變數、引用、與物件

a=3實現過程中的python內部結構圖及其解析:執行a=3後,

變數a變成物件3的乙個引用。

變數名 引用 物件

.a . 3

.1、關於變數:變數事實上是到物件記憶體空間的乙個指標;是乙個系統表的元素,

擁有指向物件的連線的空間。

2、關於引用:從變數到物件的連線稱作引用,引用是一種關係,

以記憶體中的指標的形式存在;是自動形成的從變數到物件的指標。

3、關於物件:是分配到一塊記憶體,有足夠的空間去表示它們所代表的值。

""""""

三、關於不變物件:

1、從內部來看作為一種優化,python快取了不變的物件並對其進行復用。

2、不變的物件包括小的整數和字串等

"""x = 1

y = 1

if x is y: #x和y是同乙個物件

print id(x), id(y) #42896512 42896512

s = "ello,python"

s1 = "hello,python"

if s is s1: #s和s1是同乙個物件

print id(s), id(s1)

"""四、型別與物件、變數

1、型別與物件、變數的關係:

1)型別屬於物件,而不是變數。

2)python的變數就是在特定的時間引用了乙個特定的物件

3)物件知道自己的型別,每個物件都包含了乙個頭部資訊,

其中標記了這個物件的型別

2、物件的內部結構:

1)物件由三部分組成: 型別|計數器|值

2)頭部資訊:乙個是型別標誌符,另乙個是引用計數器

3)計數器及其**:每個物件中保持了乙個計數器,

計數器記錄了當前指向該物件的引用的數目,

這個計數器被設定為零,這個物件的記憶體空間就會自動**。

"""b = 3

b = 'spam'

b = 1.33

print

"b=", b #表面上是b變成了不同型別的資料,

實質是變數b引用了不同型別的物件

"""五、共享引用:多變數名引用同乙個物件

"""#1、不可變物件的共享引用

c = 3

d = c

"""內部結構圖:

變數名 引用 物件

c .

. 3

d .

變數a、b指向同乙個物件

"""print c is d #true

c = "hello!"

print c, d #hello! 3

#2、可變物件的引用,可本地修改變數的值

l1 = [1, 2, 3]

l2 = l1

l1[0] = 100

print l1,l2 #[100, 2, 3] [100, 2, 3]

print l1 is l2 #true

動態型別 動態繫結 動態載入

1.動態型別 執行時才知道,物件的型別,動態型別在程式設計中非常常見,簡單的說就是id型別 比如 在自定的時候就是,id型別。當前我們有時候自己定的方法,不確定,傳進來的是什麼型別的物件,我們也id型別,然後在方法內部去確定型別 2.動態繫結 物件被例項化後,就確定的物件型別,也確定了物件的屬性和響...

動態語言的動態型別

1.在靜態語言中,宣告的目的是為了告訴編譯器所使用的變數 是什麼 使型別檢查可以在編譯階段靜態地進行,儘量減少執行時的型別檢查,提高執行效率,但缺乏靈活性。2.而在動態語言中,變數被設計成無型別的,變數的型別可以按需改變,同乙個變數既可作為整型的,也可作為字串,還可用來定義函式。那麼如何保證所執行的...

靜態型別與動態型別

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤,需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...