Kdb 已定义命名空间中的字典分配失败

Kdb 已定义命名空间中的字典分配失败,kdb,Kdb,首先我显示我当前的名称空间,然后定义一个新的名称空间,然后我尝试创建一个字典 为什么第一次赋值失败,而在未定义的命名空间中赋值成功 q)key ` `q`Q`h`o q).foo '.foo q).foo:()!() q).foo.bar:`a`b`c!1 2 3 '.foo.bar q).foobar.bar:`a`b`c!1 2 3 q).foobar.bar a| 1 b| 2 c| 3 您需要初始化名称空间,如下所示: q).foo:enlist[`]!enlist[::] q).fo

首先我显示我当前的名称空间,然后定义一个新的名称空间,然后我尝试创建一个字典

为什么第一次赋值失败,而在未定义的命名空间中赋值成功

q)key `
`q`Q`h`o
q).foo
'.foo
q).foo:()!()
q).foo.bar:`a`b`c!1 2 3
'.foo.bar
q).foobar.bar:`a`b`c!1 2 3
q).foobar.bar
a| 1
b| 2
c| 3

您需要初始化名称空间,如下所示:

q).foo:enlist[`]!enlist[::]
q).foo
| ::
q)
q).foo.bar:`a`b`c!1 2 3
q)
q).foo.bar
a| 1
b| 2
c| 3
在第二种情况下,q有效地为您从code.kx执行此操作:

上下文实际上是一个排序字典,其域是一个符号列表,其中包含上下文中定义的实体名称

如果将代码更改为以下内容,它将按预期工作:

q).foo:(`symbol$())!()
q).foo.bar:`a`b`c!1 2 3
q).foo.bar
a| 1
b| 2
c| 3

谢谢你的回答@jgleeson。但是我已经读到,一旦定义了上下文,就不可能删除它了?是这样吗?我认为你不能删除上下文。。可能是一个安全功能,阻止您意外删除.q或.q。有趣的是@terrylynch的答案可能比我的更正确,因为它使用null元素初始化上下文。如果您查看.q或.q等,您将看到它们都有这个空的第一个元素。虽然我做了一些测试,但还没有看到为什么需要这个元素。null元素强制执行一个混合列表,并可以防止名称空间在某些情况下崩溃为不同的结构,这并不是一件容易的事。例如,如果您将其初始化为.foo:symbol$!`和define.foo.bar1:abc!1.23`and.foo.bar2:abc!1 2 3`然后字典的值折叠到一个类型为98的表中。