2012-08-03 126 views
0

我是新來的python編程。我在python中提到不同的教程,很少有作者說在python中像Numbers(int,float,complex),列表,集合,元組,字典,字符串都是數據類型。結構很少說班。我很困惑哪一個是正確的。python數據類型是類還是數據結構?

我正在做一篇關於Python的文章,並在隨機網站上發現了這條語句,只是想知道是否有人可以澄清並證明你的答案。

+2

Python中的所有東西都是一個對象。一個類是一種數據類型。一個足夠複雜的類是一個數據結構。 – geoffspear 2012-08-03 18:50:21

+1

我猜你是從C背景來的?你將不得不改變你的想法。剛開始使用python教程編寫代碼並查看超高級語言的本質。 – 2012-08-03 18:57:32

回答

0

術語「數據類型」和「類」在Python中是同義詞,它們對於您給出的示例都是正確的。與其他一些語言不同,沒有簡單的類型,Python中的所有內容(可以指向一個變量)都是一個對象。另一方面,術語「數據結構」應該可以用於容器類型,例如集合,元組,字典或列表。

+0

感謝F.J,你是說集合,元組,字典或列表是數據結構而不是數據類型? – user1559873 2012-08-03 19:19:10

+0

@ user1559873 - 不,它們都是數據類型和數據結構。數字類型(int,long,float)是數據類型,但將它們稱爲數據結構會令人困惑(但不一定是錯誤的)。 – 2012-08-03 19:30:26

1

隨着時間的推移,確切含義略有變化。最新版本的python(python 3)是最簡單和最一致的,所以我會解釋一下。


讓我們從有兩種東西開始:值和值的類型。

python中的值可以是,例如數字,列表甚至函數。

值的類型描述了這些。所以例如數字的類型可能是int

到目前爲止,我們只考慮了「內置於」語言的東西。但你也可以定義你自己的東西。要做到這一點,你要定義一個新的班級。該type()功能會說(在Python 3)您的類的實例的類型是類本身:

所以也許你定義一個類叫做MyFoo:

>>> class MyFoo: 
>>>  def __init__(self, a): 
>>>   self.a = a 
>>> 
>>> foo = MyFoo(1) 
>>> type(foo) 
<class '__main__.MyFoo'> 

比較,與整數:

>>> type(1) 
<class 'int'> 

很明顯,您的價值的類型是它的類。

因此Python中的值(例如數字,列表,甚至函數)都是類的實例。並且值的類型是描述其行爲的類。

現在事情變得更加複雜,因爲您也可以將一個類型賦值給一個值!那麼你有一個值是一個類型:

>>> x = type(1) 
>>> type(x) 
<class 'type'> 

事實證明,任何類型的類型是type。這意味着任何類本身都是一個實例(type)。這有點奇怪。但它是一致的,而不是您通常需要擔心的事情。


所以,總之,爲Python 3(這是最簡單的):

  • 每個值具有類型
  • 的類型描述的值是如何工作的
  • 的類型都是類
  • 類的一個實例的類型是它的類
  • 數字,列表,函數,用戶定義的對象都是類的所有實例
  • 偶類是類的實例!他們是type的實例!

最後,要儘量回答你的問題相關。有些人調用類數據類型和實例數據結構(我認爲)。這是混亂和混亂,人們不是很小心。只需堅持使用類和類型(實際上是同樣的事情)和實例是最簡單的。

2

「數據類型」是一種數據的描述:什麼類型的值可以是這種類型的實例,以及可以對它們進行什麼樣的操作。

「類」是表示數據類型(儘管不是唯一的方式)的一種方式,將類型上的操作視爲類型實例上的「方法」(稱爲「對象」)。這是跨所有基於類的語言的通用術語。但是Python對「類」也有特定的含義:由class語句定義的東西,或者在滿足特定要求的內置/擴展代碼中定義的東西是一類。

因此,任意大小的整數和映射字典都是數據類型。在Python中,它們由內置類intdict表示。

「數據結構」是一種組織數據的方式,以實現高效或簡單的訪問。這與數據類型不直接相關。在許多語言中(比如C++或Java),定義一個新類需要告訴編譯器一個實例的成員是如何在內存中佈局的,以及類似的東西,但是在Python中,您只需構造對象並向其添加成員,解釋器找出如何組織它們。 (當您構建擴展模塊或使用​​構建包裝類時,會出現異常,但不用擔心這一點。)

當您到達更高級別的抽象數據結構時(如基於指針的節點)和較低級別的抽象數據類型(比如可以在頭部進行恆定時間插入和刪除的順序保持元素集合)。鏈表是一種固有需要特定數據結構的數據類型還是一種定義明顯數據類型的數據結構,或者是什麼?那麼,除非你在大學裏主修計算機科學,否則只要你理解了這個問題,答案就不會有太大的變化。因此,映射字典是數據類型,但它們也是抽象數據結構 - 並且,在Python的dict對象中,它們是從特定的具體數據結構(帶有二次探測的開鏈接哈希表)構建的,它是仍然部分抽象(每個桶包含一個鴨型值)。