我希望将补丁变量值添加到空列表列表中。这些补丁分为不同的区域,我试图看看某些补丁变量是如何因区域而异的。 我有一个空的列表列表(实际上包含12个列表,但为了简单起见):
set mylist [[] [] [] []]
与不同区域对应的列表:
set zone-list [1 2 3 4]
以下是我正在尝试构建列表的方法:
(foreach mylist zone-list [set ?1 lput (sum-zone-variable ?2) ?1])
to-report sum-zone-variable [ n ]
report (sum [patch-variable] of patches with [zone = n])
end
当我运行它时,mylist保持为空(即未更改)。我认为问题在于foreach声明,但我无法弄清楚它是什么。有什么帮助吗?
答案 0 :(得分:2)
我可以看到foreach mylist [ set ?1 ... ]
背后的想法,但NetLogo不会那样工作。 set ?1 ...
对原始列表没有影响。 NetLogo列表是不可变的,?1
不是对列表中可更新位置的引用 - 它只是一个已复制值的临时变量。所以set ?1 ...
是你基本上不会写的东西。
如果我正确理解你的问题,那么这里的相关原语是map
。这应该做的工作:
set mylist (map [lput (sum-zone-variable ?2) ?1] mylist zonelist)
答案 1 :(得分:1)
除了必须指定名称外,您的基本方法还可以。如,
globals [mylist zone-list n-zones]
patches-own [zone zone-variable]
to setup
set n-zones 4
set zone-list n-values n-zones [?]
ask patches [set zone one-of zone-list]
set mylist n-values n-zones [[]]
end
to go
ask patches [set zone-variable random-float 1]
foreach zone-list [
let total sum [zone-variable] of patches with [zone = ?]
let oldvals item ? mylist
set mylist replace-item ? mylist (lput total oldvals)
]
end
但是,您可能希望使用表扩展名。