说我有一个巨大的列表,我想插入一个值,没有创建副本(性能)。如果想要追加到最后,就会使用lappend。有没有办法在开头和任何内部元素上做等效的?
即这段代码:
set k { 1 2 }
destr_ins k 0 0 ; #dummy proc name
puts [lindex $k 0]
会产生结果:
>0
感谢。
答案 0 :(得分:4)
没有破坏性linsert
,但您可以使用“K
”技巧伪造一个(以其中一个组合器命名,但不再需要):
set myList [linsert $myList[set myList {}] 0 "a b c"]
# ^^^^^^^^^^^^^^^^^^^^^^
字节码引擎(加上参考管理代码)可以有效地将其优化为破坏性操作,前提是列表不在其他地方共享。如果共享,则无论如何都需要副本。程序中的代码最快。
它的工作原理是将列表放在字节码引擎的堆栈上,删除变量保存的引用(假设没有跟踪),然后让linsert
代码正常工作;它有一个代码路径,用于优化非共享对象的操作。