list[::]和list有什么区别?

2024-05-14 03:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个将矩阵顺时针旋转90度的问题,我不明白为什么我不能使用:

matrix = zip(*matrix[::-1])

但是:

^{pr2}$

Tags: 矩阵zipmatrixpr2顺时针
2条回答

在Python中,所有赋值都将引用绑定到一个名称。运算符调用现有引用的方法1。在你的情况下,陈述

matrix = ...

纯粹是一项任务2。它计算右侧,并将其绑定到局部函数作用域中的名称matrix。传入时引用的任何对象matrix都保持不变。在

这就是为什么你看不到你所做的改变。并不是函数不能这样工作,而是它对旋转的列表没有任何作用。一旦函数退出,数据就会被丢弃。在

手术

^{pr2}$

另一方面,尽管有=符号3,但在语义上是一个赋值。这是对matrix.__setitem__(...)4的调用。与任何其他方法一样,__setitem__方法直接对对象进行操作,而不更改其名称绑定。在

就索引而言,[:]相当于[::]。它们分别是[0:len(matrix)]和{}的简写。在这两种情况下,将使用默认步长。一般来说,任何包含冒号的索引都将转换为^{}对象。缺少的元素被设置为None,并由此处显示的特定于序列的默认值替换。在


1一些运算符,如+=在调用方法后执行赋值。它们被称为augmented assignments。但这不是我们现在感兴趣的案子。在

2除了文字assignment statements=),其他一些类型的赋值是def(它将函数对象绑定到它的名称)、class(对类对象也一样)、import(将模块或模块的元素绑定到名称),将参数传递给函数(将对象绑定到本地参数名或kwarg字典键)和for(在每次迭代时将迭代器中的元素绑定到循环变量)。在

3从解析器的角度来看,它仍然是一个assignment,但语句的处理方式完全不同。一个实际上不是赋值的类似语句在实现为描述符的属性上使用=运算符,例如property。在

4从技术上讲,它更像是type(matrix).__setitem__(matrix, ...),但是有一些额外的优化。例如,type(matrix)的元类永远不会被搜索。在

方法中的matrix是对矩阵对象的引用。对matrix的赋值将更改matrix以引用新创建的对象,但不会更改原始对象的内容。matrix[::] =matrix引用的对象调用__setitem__,从而相应地更改对象的内容。在

相关问题 更多 >