Я пытаюсь узнать Джулию, повторив некоторые из простых проблем ProjectEuler в Джулии. До сих пор все было очень гладко, пока я не столкнулся с этой расстраивающей проблемой. Я провел некоторое время отладки мой код, и вот что я нашел: (Надеюсь, я не хватает чего-то действительно глупое здесь)Джулия делает что-то странное с заданиями
function is_abundant(n::Int) #just a function
return prod(map(x->int((x[1]^(x[2]+1)-1)/(x[1]-1)),factor(n))) > 2 * n
end
abundants=[12] #there should be a better way to initialize an Array
for i=13:28120
if is_abundant(i)
push!(abundants,i)
end
end
le=abundants; #The following lines are the problems
ri=abundants;
d=length(abundants)
println(d)
pop!(le)
shift!(ri)
println(le==ri, " ", endof(ri), " ", endof(abundants))
Выход я получаю:
6964 true 6962 6962
который означает, что Джулия изменила все три комплекта le
, ri
и abundants
с каждой из pop!
и shift!
команд. Я был в состоянии работать вокруг этой ошибке/проблеме, используя тупую дополнительное тождественное отображение:
le=map(x->x,abundants)
ri=map(x->x,abundants)
Теперь выход изменится на то, что я первоначально ожидалось:
6964 false 6963 6964
Мой вопрос, если это не ошибка, почему Джулия поддерживает отношение эквивалентности между le
, ri
и abundants
устанавливает в первую очередь? Также может ли кто-нибудь воспроизвести это поведение? Я использую Julia «Версия 0.3.0-rc3 + 14 (2014-08-13 16:01 UTC)» на Ubuntu 14.04.
Существует только один массив, вы просто делаете много ссылок на него. Связано: http://julia.readthedocs.org/en/latest/manual/faq/#i-passed-an-argument-x-to-a-function-modified-it-inside-that-function-but-on -The-вне-переменной-х-это-еще-неизменной почему. – StefanKarpinski