List TCL列表与foreach问题

List TCL列表与foreach问题,list,foreach,tcl,List,Foreach,Tcl,假设我有一个TCL列表: set myList {} lappend myList [list a b 1] lappend myList [list c d 2] ..... 现在我想修改如下列表: foreach item $myList { lappend item "new" } 但最后我并没有修改列表。为什么?项目是列表中的参考项目编号?项目不是列表项目的参考。这是一份副本。要想做你想做的事,你可以这样做: set newlist {} foreach item $myList {

假设我有一个TCL列表:

set myList {}
lappend myList [list a b 1]
lappend myList [list c d 2]
.....
现在我想修改如下列表:

foreach item $myList {
lappend item "new"
}
但最后我并没有修改列表。为什么?项目是列表中的参考项目编号?

项目
不是列表项目的参考。这是一份副本。要想做你想做的事,你可以这样做:

set newlist {}
foreach item $myList {
  lappend item "new"
  lappend newlist $item
}
set mylist $newlist
不是对列表项的引用。这是一份副本。要想做你想做的事,你可以这样做:

set newlist {}
foreach item $myList {
  lappend item "new"
  lappend newlist $item
}
set mylist $newlist
这里要做的是获取一个变量(称为item),并将其修改为也包含“new”。基本上,您得到的列表看起来像
{a new}
{b new}
等等。但在每次迭代结束时都会泄漏这些变量

完成后,您真正希望您的列表是什么样子的

for {set i 0} {$i < [llength $myList]} {incr i} {
    set item [lindex $myList $i]
    lappend item new
    set myList [lreplace $myList $i $i $item]
}
这里要做的是获取一个变量(称为item),并将其修改为也包含“new”。基本上,您得到的列表看起来像
{a new}
{b new}
等等。但在每次迭代结束时都会泄漏这些变量

完成后,您真正希望列表是什么样子的?

对于{set i 0}{$i<[llength$myList]}{incr i}{
for {set i 0} {$i < [llength $myList]} {incr i} {
    set item [lindex $myList $i]
    lappend item new
    set myList [lreplace $myList $i $i $item]
}
集合项目[lindex$myList$i] lappend项目新 设置myList[替换$myList$i$i$item] }
如果您的列表非常大,则可以提高一些效率(例如。它们只会在这里增加复杂性。

对于{set i 0}{$i<[llength$myList]}{incr i}{
集合项目[lindex$myList$i]
lappend项目新
设置myList[替换$myList$i$i$item]
}

如果您的列表非常大,则可以提高一些效率(例如。他们只会在这里增加复杂性。

要“就地”编辑列表,您可以执行以下操作:

set idx -1
foreach item $myList {
    lappend item "new"
    lset myList [incr idx] $item
}
如果您有Tcl 8.6,也可以这样做(请注意,我实际上没有使用
$item
;这只是方便的循环):


但它在8.5版上不起作用,在8.5版中,
lset
将只替换现有项(和子列表)。

要“就地”编辑列表,可以执行以下操作:

set idx -1
foreach item $myList {
    lappend item "new"
    lset myList [incr idx] $item
}
如果您有Tcl 8.6,也可以这样做(请注意,我实际上没有使用
$item
;这只是方便的循环):


但是它在8.5上不起作用,在8.5中,
lset
将只替换现有的项(和子列表)。

我想在列表的每个子列表的末尾添加一个变量。我想在列表的每个子列表的末尾添加一个变量。