<p>你的<code>item =</code>。。。。行,正如它所示,只是将一个新对象与函数名称空间中的名称<code>item</code>相关联。此操作没有理由更改从中提取<code>item</code>的<em>上一个</em>值的list对象的内容。在</p>
<p>下面是一个列表,它可以就地更改列表:</p>
<pre><code>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)
</code></pre>
<p><code>lyst[i] =</code>。。。赋值是实际更改列表内容的关键行。当然,如果你想的话,你可以把这两个作业压缩成一行:<code>lyst[i] = item =</code>。。。。。或者,如果不打算在循环中再次使用<code>item</code>,则可以省略对<code>item</code>的重新分配:<code>lyst[i] = item + item *</code>。。。在</p>
<p>注意,除此之外,我还执行了两个小的修复:我将变量名从<code>list</code>改为<code>lyst</code>,这样它就不会掩盖对<code>list</code>类的内置引用。我还修改了您的函数,使其将list对象作为参数,而不是依赖于使用硬编码的全局变量名来引用它。这两个都是很好的实践,与你的问题无关。在</p>
<p>最后,请注意,使用所谓的<a href="https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions" rel="nofollow">list comprehension</a>可以更简洁、更透明地完成所有这些。如果您不必在适当的地方修改列表,例如,如果最后可以修改原始列表的<em>副本:</p>
^{pr2}$
<p>如果您需要修改列表(例如,如果其他地方存在对原始列表的引用,并且它们也应该在调用<code>change()</code>之后指向更新的内容),那么您可以按照Padraic的建议进行操作:</p>
<pre><code>lyst[:] = [ item + item * random.uniform(-10, 10) for item in lyst ]
</code></pre>
<p>在最后一种情况下,如果您更改括号形状并使用<a href="https://docs.python.org/2/tutorial/classes.html#generator-expressions" rel="nofollow">generator expression</a>,您甚至可以节省内存(这只对非常大的列表有影响):</p>
<pre><code>lyst[:] = ( item + item * random.uniform(-10, 10) for item in lyst )
</code></pre>