我想在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
。不管以前的价值是多少。但我想知道如何在第一个列表中更改值。感谢
答案 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] 引用的对象的引用。换句话说,item
和u[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)
这会逐一改变你项目的引用。