python 3:列表不要更改它们的值

时间:2016-01-15 21:31:36

标签: python list

所以我试图使用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)

(我也不知道如何粘贴多行代码,所以我一个接一个地做了,也非常感谢帮助) 现在,当它打印列表时,它只包含它开始的数字。

3 个答案:

答案 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 = .....如果你不打算在循环中再次使用它,你可以省略重新分配给itemlyst[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)