python3:列表不会改变它们的值

2024-09-21 05:45:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

(另外,我不知道如何粘贴多行代码,所以我一行一行地粘贴,希望能得到帮助) 现在,当它打印列表时,它只包含它开头的数字。在


Tags: inimport列表for粘贴defasrandom
3条回答

使用函数式方法和列表理解而不是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)

您需要将计算的值存储回列表中。在

所以替换:

for item in list:
    item = item + item*rdm.uniform(-10, 10)

有:

^{pr2}$

使用修改后的循环,您将循环使用列表中的每个元素及其索引。现在,您可以将计算出的值分配回列表中的特定索引。在

你的item =。。。。行,正如它所示,只是将一个新对象与函数名称空间中的名称item相关联。此操作没有理由更改从中提取item上一个值的list对象的内容。在

下面是一个列表,它可以就地更改列表:

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,则可以省略对item的重新分配:lyst[i] = item + item *。。。在

注意,除此之外,我还执行了两个小的修复:我将变量名从list改为lyst,这样它就不会掩盖对list类的内置引用。我还修改了您的函数,使其将list对象作为参数,而不是依赖于使用硬编码的全局变量名来引用它。这两个都是很好的实践,与你的问题无关。在

最后,请注意,使用所谓的list comprehension可以更简洁、更透明地完成所有这些。如果您不必在适当的地方修改列表,例如,如果最后可以修改原始列表的副本:

^{pr2}$

如果您需要修改列表(例如,如果其他地方存在对原始列表的引用,并且它们也应该在调用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 )

相关问题 更多 >

    热门问题