为什么循环变量的地址在使用时会发生变化?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么循环变量的地址在使用时会发生变化?相关的知识,希望对你有一定的参考价值。

计划1:

 library(pryr)

 for (x in 1:3) {
     print(c(address(x), refs(x)))
 }

输出例如:

[1] "0x7a6a6c8" "1"        
[1] "0x7a6a6c8" "1"        
[1] "0x7a6a6c8" "1"

计划2:

library(pryr)

for (x in 1:3) {
  print(c(address(x), refs(x)))
  print(x)
}

输出例如:

[1] "0x7ae0298" "1"        
[1] 1
[1] "0x7ae88c8" "1"        
[1] 2
[1] "0x7af2668" "1"        
[1] 3

显然,x的价值在计划2中正在发生变化,但为什么地址也会发生变化?当循环运行大约500,000,000次而循环期间没有调用gc时,这会导致内存泄漏吗?

答案

在循环的末尾打印(x)将其标记为多引用,如@alexis_laz所述。由于R是一种动态语言,因此很容易发生。为了测试这种效果,我们可以打印refs(x),print(x),refs(x)的输出:

for (x in 1:3) {
  print(refs(x))
  print(x)
  print(refs(x)); cat("
")
}

输出:

[1] 1
[1] 1
[1] 2

[1] 1
[1] 2
[1] 2

[1] 1
[1] 3
[1] 2

以上是关于为什么循环变量的地址在使用时会发生变化?的主要内容,如果未能解决你的问题,请参考以下文章

变量在我的循环内部发生了变化,但在 React Native 的主代码中保持不变

CAS缺点

为啥切换轮播后背景图像的大小会发生变化?

在 C 中通过引用传递时会发生啥?

为啥 HttpServletRequest 对象在从一个 servlet 转发到另一个 servlet 时会发生变化?

BUG 标记触摸时会改变颜色