说我有一个TCL列表:
set myList {}
lappend myList [list a b 1]
lappend myList [list c d 2]
.....
现在我想修改这样的列表:
foreach item $myList {
lappend item "new"
}
但最后我没有修改列表。为什么? item是列表项no?
的引用答案 0 :(得分:7)
item
不对列表项的引用。这是副本。要做你想做的事,你可以这样做:
set newlist {}
foreach item $myList {
lappend item "new"
lappend newlist $item
}
set mylist $newlist
答案 1 :(得分:2)
要“就地”编辑列表,您可以执行以下操作:
set idx -1
foreach item $myList {
lappend item "new"
lset myList [incr idx] $item
}
如果你有Tcl 8.6,你也可以这样做(注意我实际上并没有使用$item
;它只是方便的循环):
set idx -1
foreach item $myList {
lset myList [incr idx] end+1 "new"
}
但它不适用于8.5,其中lset
只会替换现有的项目(以及子列表)。
答案 2 :(得分:0)
foreach item $myList {
lappend item "new"
}
你在这里做的是获取一个变量(称为item),并将其修改为也包含'new'。基本上,您会获得类似{a new}
,{b new}
等的列表。但是在每次迭代结束时泄漏这些变量。
当你完成时,你真的希望你的列表看起来像什么?
答案 3 :(得分:0)
for {set i 0} {$i < [llength $myList]} {incr i} {
set item [lindex $myList $i]
lappend item new
set myList [lreplace $myList $i $i $item]
}
如果您的列表非常大,可以提高效率(例如K combinator)。他们只会增加复杂性。