TCL列表和foreach问题

时间:2011-04-06 14:29:54

标签: list foreach tcl

说我有一个TCL列表:

set myList {}
lappend myList [list a b 1]
lappend myList [list c d 2]
.....

现在我想修改这样的列表:

foreach item $myList {
lappend item "new"
}

但最后我没有修改列表。为什么? item是列表项no?

的引用

4 个答案:

答案 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)。他们只会增加复杂性。