Python 排序时访问列表

Python 排序时访问列表,python,list,sorting,python-internals,Python,List,Sorting,Python Internals,当列表在list.sort()中排序时,我是否可以访问该列表 这是回报 b[]检查这个 检查这个 f[]检查这个 检查这个 检查这个 检查这个 a[]检查这个 请注意,列表b中的各个项目被发送到函数m。但是在m处,列表b为空,但是它可以看到变量f,该变量的范围与列表b相同。为什么函数m将b打印为[]?查看(CPython的,其他实现可能不同的行为)脚本的奇怪输出变得显而易见: /*列表暂时变为空,以便执行突变 *通过比较,函数不能影响我们正在使用的内存片 *排序(在排序期间允许突变是一个核心转

当列表在
list.sort()中排序时,我是否可以访问该列表

这是回报

b[]检查这个
检查这个
f[]检查这个
检查这个
检查这个
检查这个
a[]检查这个
请注意,列表
b
中的各个项目被发送到函数
m
。但是在
m
处,列表
b
为空,但是它可以看到变量
f
,该变量的范围与列表
b
相同。为什么函数
m
b
打印为
[]

查看(CPython的,其他实现可能不同的行为)脚本的奇怪输出变得显而易见:

/*列表暂时变为空,以便执行突变
*通过比较,函数不能影响我们正在使用的内存片
*排序(在排序期间允许突变是一个核心转储
*工厂,因为ob_项目可能会更改)。
*/
保存的对象大小=Y大小(自身);
保存的观察项目=自身->观察项目;
已保存\已分配=自->已分配;
Py_设置_大小(self,0);
注释说明了一切:当你开始排序时,列表将被清空。在外部观察者的眼中,它是“空的”

我很喜欢“堆芯倾倒厂”这个词


同时比较:

b = ['b','e','f','d','c','g','a']
f = 'check this'


def m(i):
    print i, b, f
    return None

b = sorted(b, key= m)
print b

一般来说,这是不能依赖的,不仅仅是列表,除非您所使用的方法的文档明确说明了其他情况。访问处于中间状态的对象(即,在某个迭代开始之后但尚未完成之前)是并发代码经常遇到的问题。你已经发现了一个罕见的非并发病例,但建议是一样的:避免这种情况。中间状态不保证对您有意义,也不保证根据该对象的规则是“有效”状态(当它往往被称为“不一致”状态时)。

m
确实可以看到列表
b
(否则会引发错误),只要你一调用
sort
就知道它是空的。没错,我现在改变了问题。我的+1。易变性是所有编程的终点。:-)国家Monad FTW!如果我想通过调用一个使用项的索引作为参数的函数来对列表进行排序,该怎么办。如果不复制原始列表,就没有办法做到这一点吗?@nr.o就像我在回答中所说的那样:你可以使用
sorted
(它也会创建一个副本,所以实际上没有真正的收益,但你不必显式地复制它)。@nr.o:如果你想使用索引,你将使用
sorted(枚举(l),key=which)
而不是调用
索引
,因为当列表包含重复项时,
索引
的速度要慢得多,并且容易出现错误。这种行为也有一个特定的原因。参见注释10,可变序列类型下。
b = ['b','e','f','d','c','g','a']
f = 'check this'


def m(i):
    print i, b, f
    return None

b = sorted(b, key= m)
print b