7

我想在 python 中初始化一个列表。我不明白为什么下面的代码不起作用:

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

还有其他方法可以初始化列表,例如:

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

但是,我的问题是为什么第一个代码不起作用。

编辑:我是 Python 和编程的新手。不幸的是,我不明白你的答案的某些部分。例如:
- rebinding in " rebinding the name itemto the length of the name item"
- "item"中的迭代器是一个临时变量,它u根据(隐式)迭代器指向的位置指向
a 的元素 据我所知,我的第二个示例在内存中创建 a new_list,并将值分配给new_listto u。不管以前的值是什么。但我想知道如何更改第一个列表中的值。谢谢

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 回答
3

您将名称重新绑定到刚刚被循环绑定的名称item的长度。item您不能list以这种方式初始化 a 。您所做的只是在每次迭代中重新绑定一个变量。您的列表理解是一种完全可以接受的初始化list.

于 2013-09-03T23:48:12.763 回答
1

您不能仅通过将新值分配给表示该列表中的条目的名称来更改列表的内容。您需要使用索引分配,例如将列表中的第一个条目更改为'foo'您可以执行的操作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 回答
1

第一个代码不起作用的原因是因为item它只是对序列中每个可迭代对象的引用u。当您说item = len(item)您实际上确实分配len(item)了时item,但由于item只是充当指向u[i]循环中第 i*th* 步骤的引用指针,因此它实际上不会改变u[i]自己。

要进行更改u[i],您可以像在问题中显示的那样进行列表理解,或者执行以下操作:

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

第三种方式是enumeratepython 2.3中引入的非常有用的方法。

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

Enumerate返回从其参数创建的元组列表(不要在此引用我...但它基本上充当元组列表),其中每个元组的形式为(索引,参数 [索引])。

于 2013-09-03T23:58:06.600 回答
0

第一个代码确实有效。该列表u在第一行初始化,接下来的两行执行对其余代码没有影响——它们没有意义。

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

u正在使用内容初始化列表['abc', 'de', 'fghi', 'jklm', 'n', '']- 这就是初始化列表所需要做的一切。

线条

for item in u:
    item = len(item)

只需在重新绑定到值的长度属性后立即将名称绑定item到所有值,直到解释器处理完整个列表。uitem

于 2013-09-03T23:54:14.833 回答
0

item只是一个名字。在for循环中:

for item in u:

theitem是对 u[i]所指对象的引用。换句话说,和引用同一个对象。itemu[i]

但是这个声明:

item = len(item)

更改名称item引用一个 int,其值为 len(item)。

所以列表中没有任何变化。

列表理解:

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

只是创建一个新列表,名称u 现在是对新列表的引用。

如果要使用 for 循环,可以使用以下enumerate语句:

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

这会一一改变你对项目的引用。

于 2013-09-04T03:08:55.083 回答