You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kdb练习程序终端输出空值(::)的原因求解

KDB中each迭代后出现空值::的原因

我正在练习KDB编程,写了一个判断今日是否为某人生日的程序(用字母替代姓名),但终端输出里出现了三个空值::,添加字典条目后空值数量也跟着增加。另外一个简单的show each调用也有类似的异常输出。

相关代码:

.aaa.bdic: `a`b`c!((01 12);(02 01);(29 04))

.aaa.bdic
a| 1  12
b| 2  1 
c| 29 4 

{if[((`dd $ .z.P)=.aaa.bdic[x][0]) and (`mm $ .z.P)=.aaa.bdic[x][1]; show "it's " , (string x) , "'s birthday!"]}each key .aaa.bdic

"it's c's birthday!"
::
::
::

添加条目后空值变为四个,另一个示例:

show each .aaa.bdic
1 12
2 1
29 4
a| ::
b| ::
c| ::

想知道这些空值::产生的原因。


这些::是KDB里的空原子,本质是因为each会把迭代时每个函数调用的返回值收集起来,而你的函数多数时候没有返回有效内容:

  1. 第一个示例中的if逻辑:

    • 当if条件满足时,你调用了show函数——show的作用是把内容输出到终端,但它自身的返回值就是::。
    • 当if条件不满足时,if没有执行任何分支,KDB会默认返回::作为该语句的结果。
    • each遍历字典的所有key(示例里是3个),把每个key对应的函数返回值攒成列表,所以最终会输出3个::。添加字典条目后,遍历的key数量增加,空值数量自然同步变多。
  2. 第二个示例中的show each:

    • 每调用一次show打印字典值时,先输出值,然后返回::。
    • each将这些::拼接成和原字典结构一致的新字典(键相同,值全为::),所以在输出三个字典值后,还会输出这个全是::的字典。

如果想避免这些多余的::输出,可以让函数返回空列表(),或者用do代替if来执行无返回的逻辑,比如:

{do[((`dd $ .z.P)=.aaa.bdic[x][0]) and (`mm $ .z.P)=.aaa.bdic[x][1]; show "it's " , (string x) , "'s birthday!"]}each key .aaa.bdic

do语句执行后不会返回任何值,each收集的结果会是空列表,终端就不会输出多余的::了。

内容的提问来源于stack exchange,提问作者Sophia Hass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:17:49