[英]Multiply every element of a list by a number
我希望將列表中的所有元素乘以數字。 我知道其他方法,但我想知道為什么這不起作用? 我得到了與輸出完全相同的列表。
lst = eval(input('enter a list'))
for num in lst:
num = num * 2
print(lst)
這是不是因為工作,你使用for
循環名單上並定義/更改num
全局變量,而不是在元素lst
列表。
例如:
>>> l = [1, 5, 8]
>>> for num in l:
... num *= 2
...
...
>>> num
16
>>> l
[1, 5, 8]
在這種情況下,在第一個循環中, num
是1
( l
的第一個元素),肯定1 * 2
給出2
。
然后, num
變為5
因為5
是列表中的第二個元素。 在num * 2
, num
變為10
。
在第二個for
循環中,它變為8 * 2
16
。 它不會再次改變,因為for
循環結束了。
但是,在此循環期間,您沒有更改列表的任何內容。 因為for
僅獲取列表中的元素,並把它變成一個臨時變量 。
當您在for
循環中更改該臨時變量時 ,您沒有更改列表中的任何內容。
好吧,既然你寫了“我知道其他方法,但我想知道為什么這不起作用?” ,這是你的答案:你只修改臨時循環變量num
,而不是列表本身。 嘗試這個:
for i, num in enumerate(lst):
lst[i] = lst[i] * 2
你沒有改變lst
的元素,這樣做:
for num in range(len(lst)):
lst[num] *= 2
lst=eval(input('enter a list'))
lst=list(map(lambda num:num*2,lst))
print (lst)
你需要更新lst。
由於安全起見,最好使用ast.literal_eval
然后使用eval
。 你可以在這里閱讀它。 你可以用列表理解來解決這個問題:
import ast
lst = ast.literal_eval(input('enter a list'))
lst = [num*2 for num in lst]
print(lst)
列表推導比使用lambda
map
更快。 時間安排 :
lst = list(range(1000))
In [56]: %timeit list(map(lambda num:num*2,lst))
10000 loops, best of 3: 169 us per loop
In [57]: %timeit [num*2 for num in lst]
10000 loops, best of 3: 80.5 us per loop
兩個干凈的表達:
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]
正如其他人所指出的那樣,正確的方法是通過索引到列表中:
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中引用的對象也會更改。
這篇Pass By Reference更深入地討論了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.