2016-12-14 52 views
2

让我们看看下面的示例代码:dict从嵌套字典中获得dict,在tcl中创建一个副本?

set m [ dict create 1 [ dict create 2 3] 4 [ dict create 5 6 ] ] 
set p [ dict get $m 4 ] 

现在,这里是个问题。假设我没有改变p。 TCL创建另一个副本,还是只是一个指针?
谢谢。

+0

为了澄清,我想知道预期的行为。不是“试着看看会发生什么”,以便我知道我能依靠什么,以及我可以作为错误报告的内容。 谢谢 – user1134991

回答

2

Tcl的语义模型具有不可改变的价值,即当您在查看某个值时,世界上其他地方没有发生任何事情会使该值发生变化。 (变量可以改变,但这是通过将不同的值放入其中)。这样做的结果是Tcl可以积极地共享对值的引用。这意味着它的集合值(列表和字典)有效地保存了这些引用,并且dict get操作将简单地复制一个引用;实际值本身并不存在,但字典和值都有它的句柄。它看起来就像一个副本,但效率更高。

有一个额外的细微差别:当一个变量具有参照值,在变量操作可以直接修改而不必复制值。然而,这不是你能看到的东西,除了它提高了性能。

2

不,它不创建新副本,直到通过对象的“所有者”之一进行更改。

但是p仍然不是指针。对于所有编程意图和目的,它只是一个保存av值的普通变量。

相关问题