所以我试图使用for循环以随机百分比更改一堆列表项。
import random as rdm
list = [1000, 100, 50, 25]
def change():
for item in list:
item = item + item*rdm.uniform(-10, 10)
change()
print(list)
(我也不知道如何粘贴多行代码,所以我一个接一个地做了,也非常感谢帮助) 现在,当它打印列表时,它只包含它开始的数字。
答案 0 :(得分:5)
您的item =
....行,只是将新对象与函数名称空间中的名称item
相关联。没有理由为什么此操作会更改从中提取之前值item
的列表对象的内容。
这是一个可以就地更改列表的列表:
import random
lyst = [1000,100,50,25]
def change(lyst):
for i, item in enumerate(lyst):
item = item + item * random.uniform(-10, 10)
lyst[i] = item
print(lyst)
change(lyst)
print(lyst)
lyst[i] =
...赋值是实际更改列表内容的关键行。当然,如果你愿意,你可以将两个作业折叠成一行:lyst[i] = item =
.....如果你不打算在循环中再次使用它,你可以省略重新分配给item
:lyst[i] = item + item *
...
请注意,我还添加了两个小修补程序:我将变量名称从list
更改为lyst
,这样就不会掩盖对list
类的内置引用。我还改变了你的函数,使它将列表对象作为参数,而不是依赖于使用硬编码的全局变量名称来引用它。这两者都是好的做法;与你的问题无关。
最后,请注意,您可以使用所谓的list comprehension更加简洁明了地完成所有这些操作。如果您不必就地修改列表,即如果可以最终修改原始列表的副本:
lyst = [ item + item * random.uniform(-10, 10) for item in lyst ]
如果您需要就地修改列表(例如,如果原始列表的其他引用存在于其他位置,并且它们也应指向调用change()
后更新的内容),那么您可以按照建议操作在Padraic的评论中:
lyst[:] = [ item + item * random.uniform(-10, 10) for item in lyst ]
在最后一种情况下,如果更改括号形状从而使用generator expression代替,则甚至可以节省内存(这只是非常大的列表所关注的内容):
lyst[:] = ( item + item * random.uniform(-10, 10) for item in lyst )
答案 1 :(得分:0)
您需要将计算值存储回列表。
所以替换:
for item in list:
item = item + item*rdm.uniform(-10, 10)
使用:
for index, item in enumerate(list):
list[index] = item + item*rdm.uniform(-10, 10);
使用修改后的循环,您将使用其索引循环遍历列表中的每个元素。您现在可以将计算值分配回列表中的特定索引。
答案 2 :(得分:0)
使用功能方法和列表推导而不是for循环,您可以使用更改的项创建新列表(除非您需要修改现有列表):
import random as rdm
items = [1000, 100, 50, 25]
def change(items, multiply_min=-10, multiply_max=10):
return [i * rdm.uniform(multiply_min, multiply_max) for i in items]
items = change(items)
print(items)