lobstr::obj_addr处理列表元素时输出随机变化的原因咨询
问题原因解析
这个现象的核心在于R的懒求值机制和lobstr::obj_addr的工作逻辑:
- 直接调用
lobstr::obj_addr(a)时,a是已经完成求值的变量,传递给obj_addr的是实际的整数向量对象,因此返回的是该向量在内存中的固定地址。 - 当使用
lapply(list(a,b,c), lobstr::obj_addr)时,R的函数参数采用懒求值策略:lapply在迭代过程中,会将列表的每个元素以promise对象的形式传递给obj_addr,而非直接传递实际的整数向量。lobstr::obj_addr返回的是这个临时创建的promise对象的内存地址,而非promise指向的底层整数向量地址。 - 每次运行
lapply时,都会生成全新的promise对象,因此每次得到的地址结果都不同;但这些promise最终指向的都是同一个整数向量,所以预先将列表赋值给x后,obj_addr(x[[1]])会直接求值得到底层向量的地址,自然和obj_addr(a)完全一致。
补充验证:你可以通过强制求值promise来验证这一点,比如执行lapply(list(a,b,c), function(x) lobstr::obj_addr(force(x))),此时返回的地址会和直接调用obj_addr(a)的结果完全一致——因为force(x)强制将promise求值为实际的整数向量,obj_addr此时返回的就是底层对象的地址。
内容的提问来源于stack exchange,提问作者mysteriarcha
相关产品推荐
相关产品推荐

