List TCL列表与foreach问题
假设我有一个TCL列表: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 {
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
将只替换现有的项(和子列表)。我想在列表的每个子列表的末尾添加一个变量。我想在列表的每个子列表的末尾添加一个变量。