我有以下代码:
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)
当我执行它时,它为第一个打印语句提供了两个不同的输出,在标记=排序(标记)之前和之后。
这是输出:
- + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + [33,93,151,212,265,409,640,786,524,317] [33,93,151,212,265,317,409,524,640,786]
当循环读取时间轴中的项目时,标记不是按顺序递增吗?
但是,假设它不是这样的,这是如何工作的?
答案 0 :(得分:0)
您的代码没有问题。代码工作得很好,这就是它的原因。您将分配给相同的变量,这就是它显示不同输出的原因。当您执行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]
答案 1 :(得分:0)
您假设timeline_markers存储为排序列表,但事实并非如此。虽然它们作为公共列表/数组呈现给python,但它们由blender内部存储为链表。如果您追溯源代码,您会发现它们使用DNA_listBase.h中定义的ListBase并在listbase.c中实现。
虽然我们将标记视为与时间线匹配的顺序中的序列,但保持它们排序并没有真正的需要或好处。如果要按帧顺序显示标记列表,则只需自己对它们进行排序。