TCL列表和foreach问题

发布于 2024-10-30 05:50:00 字数 252 浏览 0 评论 0原文

假设我有一个 TCL 列表:

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

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

foreach item $myList {
lappend item "new"
}

但最后我还没有修改列表。为什么?项目是列表项目上的参考吗?

Say I have a TCL list:

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

Now I want to modify the list like this:

foreach item $myList {
lappend item "new"
}

But at the end I have not modified list. Why? item is a reference on the list item no?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

辞旧 2024-11-06 05:50:00

item 不是对列表项的引用。这是一个副本。为了做你想做的事,你可以这样做:

set newlist {}
foreach item $myList {
  lappend item "new"
  lappend newlist $item
}
set mylist $newlist

item is not a reference to the list item. It is a copy. To do what you want, you could do this:

set newlist {}
foreach item $myList {
  lappend item "new"
  lappend newlist $item
}
set mylist $newlist
泛滥成性 2024-11-06 05:50:00

要“就地”编辑列表,您可以这样做:

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 只会替换现有项目(和子列表)。

To edit the list “in place”, you can do this:

set idx -1
foreach item $myList {
    lappend item "new"
    lset myList [incr idx] $item
}

You can also do this if you've got Tcl 8.6 (notice that I'm not actually using $item; it's just convenient looping):

set idx -1
foreach item $myList {
    lset myList [incr idx] end+1 "new"
}

But it won't work on 8.5, where lset will only replace existing items (and sublists).

地狱即天堂 2024-11-06 05:50:00
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 组合器)。他们只会增加这里的复杂性。

for {set i 0} {$i < [llength $myList]} {incr i} {
    set item [lindex $myList $i]
    lappend item new
    set myList [lreplace $myList $i $i $item]
}

If your list is very large, some efficiencies can be made (e.g. the K combinator). They would just add complexity here.

用心笑 2024-11-06 05:50:00
foreach item $myList {
    lappend item "new"
}

您在这里所做的就是获取一个变量(称为 item),并将其修改为也包含“new”。基本上,您会得到类似于 {a new}{b new} 等的列表。但是你会在每次迭代结束时泄漏这些变量。

当你完成后,你真正希望你的清单是什么样子?

foreach item $myList {
    lappend item "new"
}

What you're doing here, is getting a variable (called item), and modifying it to also contain 'new'. basically, you get lists that look like {a new}, {b new} and so on. But you leak those variables at the end of each iteration.

What do you really want your list to look like when you're done?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文