<p>在Python中,所有赋值都将引用绑定到一个名称。运算符调用现有引用的方法<sup>1</sup>。在你的情况下,陈述</p>
<pre><code>matrix = ...
</code></pre>
<p>纯粹是一项任务<sup>2</sup>。它计算右侧,并将其绑定到局部函数作用域中的名称<code>matrix</code>。传入时引用的任何对象<code>matrix</code>都保持不变。在</p>
<p>这就是为什么你看不到你所做的改变。并不是函数不能这样工作,而是它对旋转的列表没有任何作用。一旦函数退出,数据就会被丢弃。在</p>
<p>手术</p>
^{pr2}$
<p>另一方面,尽管有<code>=</code>符号<sup>3</sup>,但在语义上是一个赋值。这是对<code>matrix.__setitem__(...)</code><sup>4</sup>的调用。与任何其他方法一样,<code>__setitem__</code>方法直接对对象进行操作,而不更改其名称绑定。在</p>
<p>就索引而言,<code>[:]</code>相当于<code>[::]</code>。它们分别是<code>[0:len(matrix)]</code>和{<cd9>}的简写。在这两种情况下,将使用默认步长。一般来说,任何包含冒号的索引都将转换为<a href="https://docs.python.org/3/library/functions.html#slice" rel="nofollow noreferrer">^{<cd10>}</a>对象。缺少的元素被设置为<code>None</code>,并由此处显示的特定于序列的默认值替换。在</p>
<hr/>
<p><sup>1</sup>一些运算符,如<code>+=</code>在调用方法后执行赋值。它们被称为<a href="https://docs.python.org/3/reference/simple_stmts.html#augmented-assignment-statements" rel="nofollow noreferrer">augmented assignments</a>。但这不是我们现在感兴趣的案子。在</p>
<p><sup>2</sup>除了文字<a href="https://docs.python.org/3/reference/simple_stmts.html#assignment-statements" rel="nofollow noreferrer">assignment statements</a>(<code>=</code>),其他一些类型的赋值是<code>def</code>(它将函数对象绑定到它的名称)、<code>class</code>(对类对象也一样)、<code>import</code>(将模块或模块的元素绑定到名称),将参数传递给函数(将对象绑定到本地参数名或kwarg字典键)和<code>for</code>(在每次迭代时将迭代器中的元素绑定到循环变量)。在</p>
<p><sup>3</sup>从解析器的角度来看,它仍然是一个<a href="https://docs.python.org/3/reference/simple_stmts.html#assignment-statements" rel="nofollow noreferrer">assignment</a>,但语句的处理方式完全不同。一个实际上不是赋值的类似语句在实现为描述符的属性上使用<code>=</code>运算符,例如<code>property</code>。在</p>
<p><sup>4</sup>从技术上讲,它更像是<code>type(matrix).__setitem__(matrix, ...)</code>,但是有一些额外的优化。例如,<code>type(matrix)</code>的元类永远不会被搜索。在</p>