将列表中的每个元素乘以数字

时间:2016-02-12 05:54:35

标签: python

我想将列表中的所有元素乘以数字。我知道其他方法,但我想知道为什么这不起作用?我得到了与输出完全相同的列表。

lst = eval(input('enter a list'))
for num in lst:
     num = num * 2
print(lst)

7 个答案:

答案 0 :(得分:6)

它无效,因为您在列表中使用Lname循环并定义/更改for全局变量,而不是num列表中的元素。

例如:

lst

在这种情况下,在第一个循环中,>>> l = [1, 5, 8] >>> for num in l: ... num *= 2 ... ... >>> num 16 >>> l [1, 5, 8] num1中的第一个元素),并确保l给出1 * 2。< / p>

然后,2成为num,因为5是列表中的第二个元素。在5之后,num * 2成为num

在第二个10循环中,它变为for8 * 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中引用的对象也会更改。

这{{}}}更深入地讨论了它。