Почему адрес переменной цикла изменяется при ее использовании?
Программа 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