我无法创建嵌套字典,将其分配给变量,覆盖其中一个内部值,然后将其分配给另一个变量而不更改原始变量的值,这是我不想要的。例如,请参阅以下代码:
Option Explicit
Sub Button1_Click()
Dim d_outer As Scripting.Dictionary
Set d_outer = New Scripting.Dictionary
Dim d_inner As Scripting.Dictionary
Set d_inner = New Scripting.Dictionary
Call d_inner.Add("key", "foo")
Call d_outer.Add("first attempt", d_inner)
' Cannot use "Add", since key already exists, must use Item()
d_inner.Item("key") = "bar"
Call d_outer.Add("second attempt", d_inner)
' Print all values.
Dim v_outer As Variant
Dim v_inner As Variant
For Each v_outer In d_outer.Keys()
For Each v_inner In d_outer(v_outer).Keys()
Debug.Print "(" & v_outer & ", " & v_inner & "): '" & d_outer(v_outer)(v_inner) & "'"
Next v_inner
Next v_outer
End Sub
这会产生以下输出:
(first attempt, key): 'bar'
(second attempt, key): 'bar'
第一次尝试的值应为foo
。为什么会更改为bar
?我该如何解决?每次我只想更改其中一个值时,是否需要创建一个新的字典,它是d_inner的精确副本?如果是这样,有没有一种简单的方法呢?
答案 0 :(得分:0)
在第一个集合中,您创建了对象的引用,而不是在其中放置值(例如)。因此,当您更改内部集合时,它将在初始外部集合中更新。
您需要创建一个New
对象以放入第二个集合。像这样:
' Cannot use "Add", since key already exists, must use Item()
Set d_inner = New Scripting.Dictionary
Call d_inner.Add("key", "bar")
给出:
(first attempt, key): 'foo'
(second attempt, key): 'bar'
根据您在此处尝试实现的目标,您可能会发现这些类的任务更灵活