2013-09-03 14 views
7

pythonでリストを初期化したい。私は以下のコードが動作しない理由を理解していない:リストのメンバーを初期化する

u = [len(item) for item in u] 

しかし、私の質問は、最初のコードは動作しませんされている理由:

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
for item in u: 
item = len(item) 

は次のように、リストを初期化する他の方法があります。

編集: 私はPythonの初心者であり、プログラミングです。残念ながら私はあなたの答えの一部を理解していません。例えば:
- 再結合
再結合itemitem名の長さ」 - でイテレータ「の項目は、」uの要素を指す一時変数であります(暗黙)イテレータは、私の知る限り理解するように、私の第二の例を
を指している場所に基づいて、メモリにnew_listを作成し、にnew_listの値を割り当て。以前の値が何であっても。しかし、最初のリストで値を変更する方法を知りたい。ありがとう

答えて

4

最初のケースでは、何も初期化していません。 "item"は、(暗黙の)イテレータがどこを指しているかに基づいて、uの要素を指す一時変数です。最初のコード作業を行い

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
v = [] 
for item in u: 
    v.append(len(item)) 
print v 
3

名前itemの名前を、ループによってバインドされたばかりの名前itemの長さに再バインドしています。このようにしてlistを初期化することはできません。それぞれの反復で変数を再バインドするだけです。リストの理解は、listを初期化するための完全に許容される方法です。

+0

itemは、リストの要素uが文字列であるため、最初の場合の文字列です。文字列のlen()を呼び出すことができます。 –

+1

うん、私は私の答えを訂正した。 –

0

:あなたが最初のスタイルでリストを初期化したい場合として、あなたはそうすることができます。リストuは最初の行で初期化され、次の2行は残りのコードに影響を与えずに実行されます。

​​

内容['abc', 'de', 'fghi', 'jklm', 'n', '']でリストuを初期化している - あなたは、リストを初期化するために必要なすべてです。

ライン

for item in u: 
    item = len(item) 

ただ、インタプリタはリスト全体を通じて取り組んできましたまで直後で1対1-値のlengthプロパティにitemを再バインドu内のすべての値に名前itemをバインドします。

+1

この回答は、OPに実際にリストを初期化する方法を伝えることによって改善することができます。 – kojiro

1

リスト内のエントリを表す名前に新しい値を割り当てるだけでは、リストの内容を変更することはできません。たとえば、リスト内の最初のエントリをに変更する場合は、インデックス割り当てを使用する必要があります。u[0] = 'foo'この場合

では、次の(あなたが質問からリストの内包があるもののクリーナー)のような何かができる:あなたのリスト内の項目が変更可能であればあなたが直接要素を変更することができることを

for i, item in enumerate(u): 
    u[i] = len(item) 

、あなたはそれらを再割り当てすることはできません。リストのリストと、例えば: itemシーケンス uの各反復可能オブジェクトへの参照だけであるため

u = [['a'], ['b', 'c']] 
for item in u: 
    item.append(len(item)) 
# u is now [['a', 1], ['b', 'c', 2]] 
1

最初のコードが機能しない理由があります。 item = len(item)と言うとき、itemに実際にlen(item)を割り当てますが、itemはループのi * th *ステップのu[i]を指すリファレンスポインタとして機能していただけなので、実際にはu[i]は変更されません。第三の方法は、Python 2.3で導入された非常に便利enumerate方法である

for i in range(len(u)): 
    u[i] = len(u[i]) 

:あなたは、あなたの質問に示したように、リストの内包表記を行うか、のような何かを行うことができますu[i]を変更するには

for i, item in enumerate(u): 
    u[i] = len(item) 

Enumerate内の各タプルの形式(インデックスである場合(これで私を引用していない...しかし、それは基本的行為タプルのリストとして)引数から作成されたタプルのリストを返します。 、引数[index])。

+0

'enumerate'の例で' u [i] = len(item) 'を使うべきです。 –

+0

変更されました。ありがとう。 – Shashank

0

itemは、の名前です。 forループで:

for item in u: 
item

U [i]はを参照するオブジェクトへの参照あります。つまり、itemu[i]は同じオブジェクトを表します。

はなく、この文:

item = len(item) 

変更名前itemには、その値がlenのさ(アイテム)int型にを参照してください。

リストに何も変更されていません。

リスト内包:

u = [len(item) for item in u] 

はちょうど新しいリストを作成し、名前 uが新しいリストへの参照です。

あなたがforループを使用したい場合は、enumerateのステートメントを使用することができます

for i, item in enumerate(u): 
    u[i] = len(item) 

U ずつの項目のreferringsを変更します。

関連する問題