<blockquote>
<p>I run <code>sliding_tristep(current_trace)</code>, in the output for the <code>print current_input, accumulator</code> line I notice that the <code>current_trace</code> has been modified</p>
</blockquote>
<p>刚刚测试了你的代码:</p>
<pre><code>>>> current_trace = [[3,5,1,5,7,9,4]]
>>> sliding_tristep(current_trace)
...
>>> current_trace
[[3, 5, 1, 5, 7, 9, 4]]
</code></pre>
<p><code>current_trace</code>没有被修改。你知道吗</p>
<blockquote>
<p>I wonder why does this happen? How is that possible for python to modify a list which is not used at all in the subsequent loop.</p>
</blockquote>
<p>不过,我猜你的意思是<code>current_input</code>,而不是<code>current_trace</code>。你知道吗</p>
<p><code>current_input</code>被修改,因为<code>trace</code>是对<code>current_input</code>的引用,跟踪被修改。你知道吗</p>
<p>如果要将<code>current_input</code>复制为<code>trace</code>,有一种方法:</p>
<pre><code>>>> foo = [1,2,3]
>>> bar = foo[:]
>>> bar.append(4)
>>> foo
[1, 2, 3]
>>> bar
[1, 2, 3, 4]
</code></pre>
<p>应用于您的代码:</p>
<pre><code>def sliding_tristep(full_trace, future_step = 2, window_size = 3):
for user_trace in full_trace:
for current_input in window(user_trace):
counter = 0
trace = current_input[:] # make a copy of current_input
accumulator = []
while counter <= future_step:
next_prediction = predict(trace)
trace.append(next_prediction)
accumulator.append(next_prediction)
trace = trace[-window_size:]
counter += 1
print current_input, accumulator
</code></pre>
<p>如果不修改列表中的元素(由于整数是不可变的,所以不能修改),可以按照我在前面的示例中建议的那样进行浅层复制。如果您使用的是可变对象(<code>lists</code>或其他类型的对象),那么您需要使用<code>copy</code>模块进行深度复制。看看这个答案:<a href="https://stackoverflow.com/a/184660/1290438">https://stackoverflow.com/a/184660/1290438</a>关于这个话题。你知道吗</p>