Юлия UndefVarError
for i in 1:2
if i == 2
print(x)
end
if i == 1
x = 0
end
end
UndefVarError: x не определено
Почему код выдает эту ошибку вместо вывода 0 в julia?
В то время как в Python следующий код вывести 0?
for i in range(2):
if i==1:
print(x)
if i==0:
x=0
2 ответа
Причина в том, что в цикле переменная получает новую привязку каждый раз при выполнении цикла, см. https://docs.julialang.org/en/latest/manual/variables-and-scoping/.
по факту while
цикл изменял это поведение между Julia 0.6.3 и Julia 0.7 (в Julia 0.6.3 новая привязка не была создана). Поэтому следующий код:
function f()
i=0
while i < 2
i+=1
if i == 2
print(x)
end
if i == 1
x = 0
end
end
end
Дает следующий вывод.
Юлия 0.6.3
julia> function f()
i=0
while i < 2
i+=1
if i == 2
print(x)
end
if i == 1
x = 0
end
end
end
f (generic function with 1 method)
julia> f()
0
Юлия 0.7.0
julia> function f()
i=0
while i < 2
i+=1
if i == 2
print(x)
end
if i == 1
x = 0
end
end
end
f (generic function with 1 method)
julia> f()
ERROR: UndefVarError: x not defined
Stacktrace:
[1] f() at .\REPL[2]:6
[2] top-level scope
For-loop создавал новую привязку уже в Julia 0.6.3 на каждой итерации, поэтому она терпит неудачу как при Julia 0.6.3, так и при Julia 0.7.0.
РЕДАКТИРОВАТЬ: я обернул примеры в функции, но вы получите тот же результат, если вы выполнили while
цикл в глобальной области видимости.
Не обращайте внимания на мой комментарий и ответьте Богумилу, потому что это реальная причина, почему ваш x
переменная исчезает во второй итерации.
Если вы хотите, чтобы ваш код работал как в Python, вы можете добавить глобальное ключевое слово в ваше назначение x
:
for i in 1:2
if i == 2
print(x)
end
if i == 1
global x = 0
end
end
Обратите внимание, что это не рекомендуется в большинстве случаев, так как это снизит производительность вашего кода. Джулии нравятся локальные переменные, которые компилятор может легко оптимизировать.