因此,我尝试使用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)
Run Code Online (Sandbox Code Playgroud)
(我也不知道如何粘贴多行代码,所以我一个接一个地做了,也很感激帮助)现在当它打印列表时,它只包含它开始的数字.
你的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)
Run Code Online (Sandbox Code Playgroud)
该lyst[i] =...任务是,实际上改变了列表的内容重点线.当然,如果您愿意,可以将两个分配折叠成一行:lyst[i] = item =.....或者item如果您不打算在循环中再次使用它,则可以省略重新分配:lyst[i] = item + item *...
请注意,我还执行了两个小修复:我将变量名称从更改为list,lyst以便它不会掩盖您对list类的内置引用.我还改变了你的函数,使它将列表对象作为参数,而不是依赖于使用硬编码的全局变量名称来引用它.这两者都是好的做法; 与你的问题无关.
最后,请注意,您可以使用所谓的列表理解更简洁,更透明地完成所有这些操作.如果您不必就地修改列表,即可以最终获得原始列表的修改副本:
lyst = [ item + item * random.uniform(-10, 10) for item in lyst ]
Run Code Online (Sandbox Code Playgroud)
如果您需要就地修改列表(例如,如果原始列表的其他引用存在于其他地方,并且它们也应该指向change()调用后的更新内容),那么您可以按照Padraic的评论中的建议:
lyst[:] = [ item + item * random.uniform(-10, 10) for item in lyst ]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,最后,你甚至可以节省内存(这仅是非常大名单的担忧),如果你改变了支架形状,从而用生成器表达式来代替:
lyst[:] = ( item + item * random.uniform(-10, 10) for item in lyst )
Run Code Online (Sandbox Code Playgroud)