2016-04-14 3 views
2

私はWhat does the "yield" keyword do in Python?にe-satisの答えを読んでいました。そして、彼は言った:あなたがそれらをあなたが望む限り多くを読むことができるので、Pythonのiterablesは実際にすべての値をメモリに格納しますか?

これらのイテレート可能オブジェクトは便利ですが、あなたは、メモリ内のすべての値を格納し、値

の多くを持っている場合、これはあなたが望むものを常にではありません

私は本当に同意しません。しかし、私はそこにコメントすることはできません。

次に、この質問が続きます。Pythonのiterableは実際にすべての値をメモリに格納していますか?

私はそう思っていました。しかし、私は昨日、Pythonの詳細な文書を見てから私の見解を変えました。

>>> import sys 
>>> def gen(): 
... n = 0                       
... while n < 10:                     
...  yield n                      
...  n += 1 
... 
>>> a = [0,1,2,3,4,5,6,7,8,9] 
>>> b = range(10) # b is a range object, which is a iterable 
>>> c = gen(10) # c is a iterator, which is a iterable too 
>>> sys.getsizeof(a) 
144 
>>> sys.getsizeof(b) 
48 
>>> sys.getsizeof(c) 
72 
>>> B = list(b)                      
>>> C = list(c)                      
>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> B 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> C 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> sys.getsizeof(B)                     
200                         
>>> sys.getsizeof(C)                   
160 

我々は反復可能なを使用している場合、すべての値を取得するために使用されているので、私たちは誤って、反復可能な店舗にメモリ内のすべての値を考えます。

私は正しいですか?

+3

その答えの中の「これらのiterables」とは、一般的にiterablesではなく、それらのリストを意味するポスターだと思います。リストはその値をメモリに格納しますが、反復可能性は必ずしも必要ではありません。 –

+0

あなたが引用した段落は、後で述べるもの(発電機のようなもの)ではなく、前に述べたiterablesを参照しています。 – molbdnilo

答えて

6

あなたは、その回答から引用するときに文脈を取りすぎました。特にiterablesのようなリストの中で作られました。ジェネレーターとyieldキーワードは、別々に解説しています。あなたの引用拡大

:あなたが反復可能である上、「...で...のために」を使用することができ

すべてを。リスト、 文字列、ファイル...あなたは彼らにあなた 願い限りを読むことができるので、

これらのイテレート可能オブジェクトは便利ですが、あなたが持っている時に何をしたいあなたは、メモリ内のすべての値を格納し、これは常に ではありません多くの価値観。

クレームはリストと文字列に該当し、メモリに保存されます。しかし、すべてのファイルをメモリに保存せずにファイルを反復処理できるので、ファイルは正しくありません。

python iterableは、値をメモリに格納する場合と格納しない場合があります。一度に1つずつ値をステップ実行し、メモリから値を引き出したり、ゼロから作成したり、ファイルなどの別のソースから値を読み取ったりすることができます。

range()が良い例です。Python 2.xでは、すべての値が前面に生成され、Python 3.xで必要に応じてメモリに格納されます。どちらも反復可能なオブジェクトを返します。

+0

今、私はiterableをもっとはっきりと理解しています。 Pythonのドキュメントによると、iterableは一度に1つずつメンバを返すことができるオブジェクトです。これは、メモリ内のすべての値を格納するかどうかにかかわらず、iterableの特性です。それは、メモリに値を格納することもあれば、格納しないこともあります、ありがとう〜 – kissg

関連する問題