我想将列表中的所有元素乘以数字。我知道其他方法,但我想知道为什么这不起作用?我得到了与输出完全相同的列表。
lst = eval(input('enter a list'))
for num in lst:
num = num * 2
print(lst)
答案 0 :(得分:6)
它无效,因为您在列表中使用Lname
循环并定义/更改for
全局变量,而不是num
列表中的元素。
例如:
lst
在这种情况下,在第一个循环中,>>> l = [1, 5, 8]
>>> for num in l:
... num *= 2
...
...
>>> num
16
>>> l
[1, 5, 8]
是num
(1
中的第一个元素),并确保l
给出1 * 2
。< / p>
然后,2
成为num
,因为5
是列表中的第二个元素。在5
之后,num * 2
成为num
。
在第二个10
循环中,它变为for
,8 * 2
。它不会再次更改,因为16
循环已结束。
但是,在此循环期间,您没有更改列表中的任何内容。因为for
只有获取列表中的元素,而将其放入临时变量。
当您在for
循环中更改临时变量时,您没有更改列表中的任何内容。
答案 1 :(得分:4)
好吧,既然你写了&#34;我知道其他方法,但我想知道为什么这不起作用?&#34; ,这是你的回答:您只修改临时循环变量num
,而不是列表本身。试试这个:
for i, num in enumerate(lst):
lst[i] = lst[i] * 2
答案 2 :(得分:4)
您没有更改lst
的元素,请执行以下操作:
for num in range(len(lst)):
lst[num] *= 2
答案 3 :(得分:3)
lst=eval(input('enter a list'))
lst=list(map(lambda num:num*2,lst))
print (lst)
您需要更新第一部分。
答案 4 :(得分:3)
由于安全起见,最好使用ast.literal_eval
然后eval
。你可以阅读它here。你可以用list comprehension解决这个问题:
import ast
lst = ast.literal_eval(input('enter a list'))
lst = [num*2 for num in lst]
print(lst)
列表推导比使用map
的{{1}}更快。的时序强>:
lambda
答案 5 :(得分:3)
两个干净的表达方式:
In [360]: lst=list(range(10))
就地改变:
In [361]: for i,v in enumerate(lst):
.....: lst[i]=v*2
.....:
In [362]: lst
Out[362]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
生成一个新列表:
In [363]: [v*2 for v in lst]
Out[363]: [0, 4, 8, 12, 16, 20, 24, 28, 32, 36]
对于输入,我更喜欢明确地拆分和转换字符串:
In [365]: lst = [int(x) for x in input().split()]
10 11 0 1 2
In [366]: lst
Out[366]: [10, 11, 0, 1, 2]
答案 6 :(得分:2)
正如其他人所指出的,正确的方法是通过索引到列表中:
myList = range(5)
for i in range(len(myList)):
myList[i] *= 2
print myList #[0,2,4,..]
使用for num in list
表示法的循环不会修改列表。因为循环变量num
在循环的每次迭代中都采用int类型的值,因为在python中int是不可变的(即它的值不能更改),num
获取整数值的副本。
当列表中的对象是可变的并且由引用传递时,这会发生变化。请考虑以下事项:
class X:
def __init__(self):
self.val = 1
myList = [X() for i in range(5)]
print [element.val for element in myList] #1,1,1,1,1
for el in myList:
el.val = 2
print [element.val for element in myList] #2,2,2,2,2
现在,由于myList包含一个可变的X对象列表,因此循环变量el
将引用复制到其中。引用指向内存中的同一对象,原始myList中的引用指向该对象。因此,当您使用循环变量更改对象时,原始myList中引用的对象也会更改。
这{{}}}更深入地讨论了它。