2011-01-09 11 views
2

この文は正しいですか?Pythonデータ型

Pythonでは、コンテナまたは変数に厳密な型 を強制しません。この コンセプトに、開発者は データ

の種類を保持するために コンテナを設計することができ、私は、Pythonでエッセイを行うと、random siteにこの文を見つけ、誰も私のためにそれを明確にすることができればちょうど思ったんだけど、お願いします。

答えて

6

リストが4つの項目、異なるタイプの各々を有する

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

このリストを検討してください。

Javaでは、型を宣言する必要があります。

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

このJavaリストには、Stringオブジェクトしか格納できません。

+2

技術的には、 'List'を' List javaList = new LinkedList (); 'として宣言することができます。プリミティブでない限り、そのリストに何かを投げることができます。非典型的なコンテナは、PythonとJavaを区別する機能ではありません。 –

+0

リストはもちろん、Javaではまったく動作しません。 –

+0

@piquadrat - あなたがJavaのオブジェクトリストを持っている場合、それらのリスト要素でのみObject操作(メンバ関数または引数として)を実行できます。 Pythonリスト 'mixed'では、文字列の混合[0]を繰り返したり、mixed [2]のreal/imag部分を得ることができます。 –

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を保持することができますが、Pythonのすべてがタイプ

2

であるオブジェクトです:

ここ
>>> 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のリスト(配列)は、豊富な添字セマンティクスを持っています。単純な式を使用して1次元および多次元スライスを得ることができます。ビルトインとサードパーティ製の特殊なコンテナ(例:numpy)は両方とも効果を発揮します。
3

他の回答として、これは確かにPythonに当てはまります。また、これはRubyやJavaScript(iirc)を含むいくつかの高水準言語の機能であることを指摘したいと思います。Javaが進んでいる限り、 の複数の型を保持するコンテナを設計することは技術的に可能ですが、同じ型から型を派生させる必要があり、型を通常通り使用するためにキャストする必要があります。 Javaで例えば1は書くことができます:

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. 
} 

voidへのポインタを使用してC/Cでの同様のソリューションは、++ 可能ですが、型チェックは、控えめに言っても毛深いなります。