Юлия 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

Обратите внимание, что это не рекомендуется в большинстве случаев, так как это снизит производительность вашего кода. Джулии нравятся локальные переменные, которые компилятор может легко оптимизировать.

Другие вопросы по тегам