擅长:python、mysql、java
<p>Python使用列表进行正常处理,这些列表接近Java ArrayList对象。因此,您只需初始化一个包含<code>numStates</code>(子)列表的列表,每个列表都包含<code>numActions</code>操作。如果使用显式循环,则附加到列表要比直接构建列表列表容易得多。因此,您可以使用:</p>
<pre><code>def initialiseQvalues(self, numStates, numActions):
self.qTable = []
for i in range(0, numStates):
self.qTable.append([])
for j in range(0, numActions):
self.qTable[i].append(0.0)
</code></pre>
<p>但真正的Python方式是使用理解:</p>
<pre><code>def initialiseQvalues(self, numStates, numActions):
return [[0.0 for j in range(numActions)] for i in range(numStates]
</code></pre>
<hr/>
<p>Python有一个包含列表列表的<em>初学者陷阱</em>(或者更一般地说是包含可变对象的容器):朴素的<code>[[0.0] * numStates] * numActions]</code>生成一个包含对同一对象的引用的外部列表。演示:</p>
<pre><code>>>> tab = [[0.0] * 3] * 2
>>> tab
[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
>>> tab[0][0] = 1.0
>>> tab
[[1.0, 0.0, 0.0], [1.0, 0.0, 0.0]]
</code></pre>
<p>更改子列表中的元素会更改所有其他子列表中的相同元素,因为外部列表只包含对同一内部对象的一组引用</p>