Python 列表和元组的行为不同

Python 列表和元组的行为不同,python,arrays,numpy,scipy,Python,Arrays,Numpy,Scipy,我很清楚这一点,但是很少有例子表明代码对这两个方面的处理是不同的(与编码约定相反),所以我(草率地)互换使用了它们 然后我遇到了一个案例,他们给出了完全不同的行为: >>> import numpy as np >>> a = np.arange(9).reshape(3,3) >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> idx = (1,

我很清楚这一点,但是很少有例子表明代码对这两个方面的处理是不同的(与编码约定相反),所以我(草率地)互换使用了它们

然后我遇到了一个案例,他们给出了完全不同的行为:

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

有人能解释一下这是怎么回事吗?更重要的是,在scipy中,这个陷阱还会出现在哪里

您将获得不同的行为,因为在numpy中,支持三种类型的索引

  • 基本切片
  • 高级索引
  • 记录存取
使用元组进行索引相当于参数列表,它作为基本切片的后缀,其中使用类似于非元组的列表会产生高级索引

还要记住,从

当选择对象obj是一个对象时,会触发高级索引 非元组序列对象,一个ndarray(数据类型为integer或bool), 或至少有一个序列对象或数据类型的ndarray的元组 整数或布尔)。有两种类型的高级索引:整数 和布尔值

高级索引始终返回数据的副本(与 返回视图的基本切片)

而且,从相同的文档中

在Python中,x[(exp1,exp2,…,expN)]相当于x[exp1,exp2, …,expN];后者只是前者的句法糖分