7

Pythonでリストを初期化したい。以下のコードが機能しない理由がわかりません。

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

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

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

しかし、私の質問は、最初のコードが機能しない理由です。

編集:私はPythonとプログラミングの初心者です。残念ながら、あなたの回答の一部が理解できません。例:
- "名前を名前の長さに再バインドする"の再バインドitemitem
- "item" のイテレータは、 (暗黙の) イテレータが指している場所に基づいてa の要素を指す一時変数ですu
。 2 番目の例では、メモリ内に を作成し、の値をにnew_list代入します。以前の値が何であったかは関係ありません。しかし、最初のリストで値を変更する方法を知りたいです。ありがとうnew_listu

4

6 に答える 6

4

最初のケースでは、何も初期化していません。「item」は、(暗黙の) イテレータが指している場所に基づいて au の要素を指す一時変数です。最初のスタイルでリストを初期化する場合は、次のようにできます。

u = ['abc', 'de', 'fghi', 'jklm', 'n', '']
v = []
for item in u:
     v.append(len(item))
print v
于 2013-09-03T23:53:26.907 に答える
1

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

この場合、次のようなことを行うことができます(ただし、質問からのリストの理解はより明確です):

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

リスト内の項目が変更可能な場合、要素を直接変更できますが、再割り当てはできないことに注意してください。たとえば、リストのリストの場合:

u = [['a'], ['b', 'c']]
for item in u:
    item.append(len(item))
# u is now [['a', 1], ['b', 'c', 2]]
于 2013-09-03T23:54:53.643 に答える
0

itemは単なる名前です。forループ内:

for item in u:

theitemは、u[i] が参照するオブジェクトへの参照です。つまり、同じオブジェクトitemを参照します。u[i]

しかし、この声明:

item = len(item)

値が len(item) である intを参照するように名前itemを変更します。

したがって、リスト u には何も変更がありません。

リスト内包表記:

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

新しいリストを作成するだけで、名前u は新しいリストへの参照になります。

enumeratefor ループを使用する場合は、次のステートメントを使用できます。

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

これにより、 u の項目の参照が1 つずつ変更されます。

于 2013-09-04T03:08:55.083 に答える
0

最初のコード機能します。リストuは最初の行で初期化され、次の 2 行はコードの残りの部分に影響を与えずに実行されます。それらには意味がありません。

u = ['abc', 'de', 'fghi', 'jklm', 'n', '']

リストuを内容で初期化['abc', 'de', 'fghi', 'jklm', 'n', '']しています - リストを初期化するために必要なのはこれだけです。

台詞

for item in u:
    item = len(item)

インタープリターがリスト全体を処理するまで、値の length プロパティに 1 つずつ再バインドした直後に、名前itemをすべての値にバインドするだけです。uitem

于 2013-09-03T23:54:14.833 に答える