初始化列表成员

时间:2013-09-03 23:46:56

标签: python list initialization

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

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

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

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

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

编辑: 我是Python和编程的新手。不幸的是,我不理解你答案的某些部分。例如:
  - 重新绑定 重新绑定将名称item改为名称item的长度   - “item”中的迭代器是一个临时变量,它根据(隐式)迭代器指向的位置指向u的元素/ em>的
据我所知,我的第二个示例在内存中创建new_list,并将new_list的值分配给u。不管以前的价值是多少。但我想知道如何在第一个列表中更改值。感谢

6 个答案:

答案 0 :(得分:4)

在第一种情况下,您没有初始化任何内容。 “item”是一个临时变量,它根据(隐式)迭代器指向的位置指向u的元素。如果要以第一种样式初始化列表,可以这样做:

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

答案 1 :(得分:3)

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

答案 2 :(得分: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]]

答案 3 :(得分:1)

第一个代码不起作用的原因是因为item只是对序列u中每个可迭代对象的引用。当您说item = len(item)时,您实际上已将len(item)分配给item,但由于item仅作为指向u[i]的{​​ 1}}的参考指针*进入循环,它实际上不会改变u[i]本身。

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

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

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

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

Enumerate返回从其参数创建的元组列表(不要引用我这个...但它基本上行为作为元组列表)里面的每个元组都是形式(索引,参数[索引])。

答案 4 :(得分:0)

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

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

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

for item in u:
    item = len(item)

在重新绑定item之后立即将名称u绑定到item中的所有值,并将其逐个绑定到值的length属性,直到解释器完成整个过程为止列表。

答案 5 :(得分:0)

item只是名称。在for循环中:

for item in u:

item是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)

这会逐一改变你项目的引用