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