回覆列表
  • 1 # 使用者3555409038722

    Python 壓根就沒有變數的概念。

    用C或C++的變數概念去理解python就會一頭霧水。

    C、C++中的變數

    C/C++中的變數的概念是面向記憶體的。

    所以你要宣告一個變數:表明空間大小,儲存的格式(整數,浮點),以及一個永久不變的名字指向這個變數。

    python只有name和object

    a = 3

    這個語句中 a 是一個名字, 3 是一個object這個語句其實並不是什麼賦值而是幹了以下三件事建立name a建立object 3將name a 關聯到 3這個object 以後就可以用a來呼叫3這個object

    所有name在建立時必須關聯到一個object。

    name可以在建立以後指向任何一個object(包括不同型別)。

    所以name本身沒有類別,他關聯的object是有類別的。

    在python中可以使用type(name)來檢視name關聯的object的型別。

    進階回答

    Python的資料模型(參見手冊章3)

    python所有的資料都用object(物件)表示物件在建立時有以下屬性標識,唯一識別,不可改變,透過id(obj)檢視型別,不可改變值,根據型別形式分為mutable(可變),immutable(不可變)

    Name(參見手冊9.1 以及此文)

    物件是用來使用的,比如參與表示式運算,或作為函式引數傳遞

    python並不直接使用object,而是使用name的間接方式:

    將name關聯到object,然後name就可以用在表示式。一個object可以被多個name關聯。name總是存在於特定的namespace中

    直觀比喻:

    物件,就像一個人,出生時就分配身份證ID,這個終身不變。人可以有不同的name(小明,兒子,父親,老公)但在特定情境下(namespace)都指的是同一個人。不同情境下(namespace),name可能指代不同人,比如每個家庭都有一個老公。

    python語法 “=”的含義

    C語言中的等號是賦值,而python中的等號大不相同

    等號有以下幾種形式( 參見7.2 assignment operator10.3.1 )

    對於等號左邊是單一目標的定義

    1,name = object

    目標是indentifier(name)將object關聯到當前namespace,如果當前namespace沒有這個name就建立

    2,mutable.attr=object

    目標是一個可變物件的屬性物件屬性被修改為(或者說指向)object

    這個與C中的把等號右邊的值放入左邊的儲存空間的概念完全不同。其它的型別賦值語句可以自己看手冊。

    物件的可變與不可變

    python奇特的可變資料

    numbers(整數,浮點,布林等)不可變,對!不可修改list,dict之類的容器類物件,是可變物件注意,容器實際儲存的是物件的reference可變是指reference可變,也就是可以把reference指向新的object語法上a=list[0]返回的是list的0位置reference關聯的object的值list[0]=4,實際是將list的0位置reference改成關聯到4這個物件也就是說,python壓根就不能直接修改基礎物件的值,只能修改容器中的renference

    幾個小實驗

    這個測試中

    如果按C語言,對I儲存空間賦值理解,id應該不變,但事實是變的以python的name關聯來理解,每個迴圈步驟,i關聯到不同的數字object,所以ID不同

    這個試驗中

    修改list,0位置的中的值,導致0位置ID的變化說明list儲存的是reference,

    這個試驗中

    a在做加法後id變了,也就是不是同一個object了這與C語言的賦值大不相同python只有物件和name,基礎的資料不可修改,所以在加法後建立了新的object用於儲存結果,然後重新關聯到name a

    寫在最後

    相比C和C++語言,python的概念模型顯得很特別。它讓程式設計者,更關注與資料物件的操作,而不是資料儲存。這使得程式設計者能快速的實現想法,而不過多專注於儲存細節。

    當然要使用好python,就要按它的思維方式去思考,這對於從C、C++這種以記憶體為基礎的程式設計模式轉換過來的人來說,可能是一個挑戰。但你只要用python,name vs object的思維,很多疑惑都會消除。

  • 中秋節和大豐收的關聯?
  • 哪款衛衣比較好看?