<p><code>0</code>不是负数,这就是为什么它总是指向最左边的元素。在</p>
<p>如果您是硬编码一个切片,这是没有问题的,因为您可以像<code>areas[-4:]</code>那样去掉右边界</p>
<p>但是如果边界是在运行时计算的,该怎么办呢?在</p>
<pre><code>>>> for left in range(-8, -3, 2):
... right = left + 4
... print(areas[left:right])
...
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
[]
</code></pre>
<p>你发现这行不通。在</p>
<p>你经常会听到只添加列表的长度:</p>
^{pr2}$
<p>但这也并不总是有效的:</p>
<pre><code>>>> for left in range(-12, -3, 2):
... right = left + 4
... print(areas[len(areas)+left:len(areas)+right])
...
[]
['hallway', 11.25, 'kitchen', 18.0]
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
['bedroom', 10.75, 'bathroom', 9.5]
</code></pre>
<p>下面是一个习语,它适用于更多情况:</p>
<pre><code>>>> for left in range(-12, -3, 2):
... right = left + 4
... print(areas[left or None:right or None])
...
['hallway', 11.25]
['hallway', 11.25, 'kitchen', 18.0]
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
['bedroom', 10.75, 'bathroom', 9.5]
</code></pre>
<p>但你也可以打破这个:</p>
<pre><code>>>> for left in range(-12, -1, 2):
... right = left + 4
... print(areas[left or None:right or None])
...
['hallway', 11.25]
['hallway', 11.25, 'kitchen', 18.0]
['kitchen', 18.0, 'living room', 20.0]
['living room', 20.0, 'bedroom', 10.75]
['bedroom', 10.75, 'bathroom', 9.5]
[]
</code></pre>
<p>我们从中学到了什么?负索引对于硬编码来说是可以的,但是在动态使用时需要一些小心。
在一个程序中,避免否定语义并一致地使用<code>max(0, index)</code>可能是最安全的。在</p>