2011-01-09 112 views
2

該語句是否正確?Python數據類型

Python對容器或變量不執行嚴格類型 。有了這個概念 ,開發人員可以設計一個 容器,以便容納不同類型的 數據

我正在做關於Python的文章,發現這種說法在random site的,只是想知道如果任何人都可以澄清這對我來說,請。

回答

6

考慮這個名單

mixed = [ "hello", 3.1415926, 42, (1+2j) ] 

的列表中有4項,每一個不同的類型。

在Java中,您必須聲明一個類型。

List<String> javaList= new LinkedList<String>(); 

這個Java列表只能存放String對象。

+2

從技術上講,你可以聲明一個`List`作爲`List javaList = new LinkedList ();`。只要它不是原始的,你可以將任何東西扔到列表中。迄今爲止,非類型化容器並不是將Python與Java區分開來的一個特性。 – 2011-01-09 21:58:50

10

是的,它是真的。

除了用於設計容器,常規列表可以容納幾種類型

>>> myList = [1, 3.14, 'string', {'key1':'value1'}, frozenset([5,2,2,3]), [1,2,3],(5+2j),(4.0,5.0), True, type(5)] 
>>> myList 
[1, 3.1400000000000001, 'string', {'key1': 'value1'}, frozenset([2, 3, 5]), [1, 2, 3], (5+2j), (4.0, 5.0), True, <type 'int'>] 
>>> [type(x) for x in myList] 
[<type 'int'>, <type 'float'>, <type 'str'>, <type 'dict'>, <type 'frozenset'>, <type 'list'>, <type 'complex'>, <type 'tuple'>, <type 'bool'>, <type 'type'>] 

即使type是一種

2

在Python中一切都是對象:

>>> id("hello world") 
4312841696 

在這裏,你可以看到即使是一個文字(在這種情況下,一個字符串)也有一個爲它保留的內存空間。

>>> class Foo(object): 
...  pass 
... 
>>> id(Foo) 
4297723600 

即使是類也是對象的實例。所以,考慮到這點,list/dict/set只包含對象的引用,而不管它們是什麼類的實例。

>>> a = [40L, "test", Foo, Foo()] 
>>> a[0] 
40L 
>>> a[1] 
'test' 
>>> a[2] 
<class '__main__.Foo'> 
>>> a[3] 
<__main__.Foo object at 0x1010e8710>  

祝你好運!

1
  1. 標準容器是無類型的:您可以將任何值存儲在列表或映射中,並且幾乎可以將任何值用作映射中的鍵。 Java也有無類型的容器,但通常人們通過使用泛型來強制執行靜態類型檢查。
  2. 你可以實現一個容器的接口(不是顯式的,你只需要用正確的名字定義一組方法),你的類將作爲容器工作。你可以做你喜歡的事情,包括類型檢查,具有默認值,高效存儲等。
  3. Python中的列表(數組)具有豐富的下標語義,例如,您可以使用簡單的表達式獲得一維和多維切片。內置和第三方特殊容器(例如numpy)都可以很好地使用它。
3

正如其他答案註釋,這是蟒蛇當然是真的。我還想指出,這是幾種高級語言的特性,包括Ruby甚至JavaScript(iirc)。就Java而言,設計一個容器的技術上是可行的,它將容納多種類型的容器,但它需要這些類型來自相同的類型,然後必須將類型轉換爲像往常一樣使用。例如在Java中一個可以寫:

Object[] mObjArr = new Object[2]; 
String mString = "This is a String"; 
Double mDouble = 3.1415; 

void assignElements() { 
    mObject[0] = (Object) mString; 
    mObject[1] = (Double) mDouble; 
} 
String getString() { 
    if (mObject[0] instanceof String) return (String) mObject[0]; 
    else return null; // or empty string or throw exception etc. 
} 
Double getDouble() { 
    if (mObject[1] instanceof Double) return (Double) mObjects[1]; 
    else return null; // or Double.NaN or throw exception etc. 
} 

在C/C++類似的解決方案使用指針中的孔隙能夠 但類型檢查變得毛狀,至少可以說。