Почему адрес переменной цикла изменяется при ее использовании?

Программа 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, но почему адрес тоже меняется? Может ли это привести к утечкам памяти, когда цикл for выполняется около 500 000 000 раз, пока gc не вызывается во время цикла?

1 ответ

Решение

Наличие print (x) в конце цикла помечает его как множественную ссылку, как упоминалось @alexis_laz. Поскольку R - динамический язык, это может произойти легко. Чтобы проверить это, мы можем напечатать выходные данные refs(x), print(x), refs(x):

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

Выход:

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

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

[1] 1
[1] 3
[1] 2
Другие вопросы по тегам