2017-08-23 12 views
1

次のいずれかの行がジェネレータと別のタプルを返す理由を理解するのに問題があります。Pythonタプル対ジェネレータ

タプルを最初の行に作成する方法と正確な理由は、2番目のタプルはタプルを作成します。

sample_list = [1, 2, 3, 4] 
generator = (i for i in sample_list) 
tuple_ = (1, 2, 3, 4) 

print type(generator) 
<type 'generator'> 

print type(tuple_) 
<type 'tuple'>  

タプルは不変オブジェクトであると私は()内のリストを展開しようとすると、それはタプルタプルを変更する必要がありますように、それはタプルを作成することはできませんので、それです。

+4

カッコは、グループ化、タプルリテラル、および関数呼び出しの3つの異なるものに対して使用されます。 '(1 + 2)'(整数)と '(1,2)(タプル))を比較してください。 'generator'の代入では、カッコはグループ化のためのものです。 'tuple'の代入では、かっこはタプルリテラルです。カッコは、カンマを含み、関数呼び出しに使用されていないタプルリテラルを表します。 – Ryan

+2

@ Ryan:それは答えです(おそらく言語文法文書をリンクしています)。 – ShadowRanger

答えて

4

値をハードコードするときにタプルが作成されると想像できますが、ジェネレータはオブジェクトを作成する方法を提供する場所に作成されます。

これは、がジェネレータになる可能性がないため動作します。そこに生成するものは何もありません。すべての要素を指定しただけで、取得するルールは指定していません。

generatorがタプルであるためには、式(i for i in sample_list)はタプルでなければなりません。コンパイルには変更可能なデータ型が必要なため、タプルのコンパウンドを作成する方法はありません。

したがって、タプルの理解であったはずの構文がジェネレータに再利用されました。

4

カッコは、グループ化、タプルリテラル、および関数呼び出しの3つの異なるものに対して使用されます。 (1 + 2)(整数)と(1, 2)(タプル)を比較してください。 generator割り当てでは、かっこはグループ化のためのものです。 tuple割り当てでは、かっこはタプルリテラルです。カッコは、カンマを含み、関数呼び出しに使用されていないタプルリテラルを表します。

+0

'(1 + 2)'の下のintはintで、 '(1,2)'は関数呼び出しですが、私が分からないことは、ジェネレータの割り当ての意味です。 –

+0

@GaurangShah: 'generator = ...'を割り当てているとき。 '... for ... in ...'はカッコの中にあるジェネレータです。 – Ryan