timeline_markers 列表在 Blender 中如何工作?

How does the timeline_markers list work in Blender?

我有以下代码:

import bpy
import math
import random


Markers = []

for marker in bpy.context.scene.timeline_markers:
    frame = marker.frame
    Markers.extend([frame])

print('-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+')
print(Markers)
Markers = sorted(Markers)
print(Markers)

当我执行它时,它为第一个打印语句提供了两个不同的输出,在 Markers = sorted(Markers) 之前和之后。

这是输出:

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ [33, 93, 151, 212, 265, 409, 640, 786, 524, 317] [33, 93, 151, 212, 265, 317, 409, 524, 640, 786]

当循环读取 timeline_markers 中的项目时,它们不是按升序排列吗?

但是,假设不是这样,这是如何工作的?

您的代码没有问题。该代码工作正常,这就是它显示的原因。您被分配给同一个变量,这就是它显示不同输出的原因。当您执行 print(Markers) 时,它会给出原始结果。在 Markers = sorted(Markers) 之后,列表被修改。所以像这样分配给其他变量 Sorted_Markers = sorted(Markers)

您可以在此处查看差异。

In [1]: markers = [33, 93, 151, 212, 265, 409, 640, 786, 524, 317]
In [2]: print (markers)
[33, 93, 151, 212, 265, 409, 640, 786, 524, 317]
In [3]: sorted_marker = sorted(markers)
In [3]: print (markers)
[33, 93, 151, 212, 265, 409, 640, 786, 524, 317]
In [4]: print (sorted_marker)
[33, 93, 151, 212, 265, 317, 409, 524, 640, 786]

您假设 timeline_markers 存储为排序列表,但事实并非如此。虽然它们作为普通 list/array 呈现给 python,但它们在 blender 内部存储为链表。如果您追溯源代码,您会发现它们使用 DNA_listBase.h and implemented in listbase.c.

中定义的 ListBase

虽然我们将标记视为与时间线匹配的顺序的序列,但对它们进行排序并没有真正的必要或好处。如果你想按帧顺序显示标记列表,那么你只需要自己对它们进行排序。