Julia 1.0 UndefVarError - Область действия переменной - PullRequest
0 голосов
/ 19 сентября 2018

Я перехожу с Юлии на 0,7 на 1,0.Кажется, что правило Юлии для области видимости переменных изменилось с 0,7 до 1,0.Например, я хочу запустить простой цикл, подобный следующему:

num = 0
for i = 1:5
    if i == 3
        num = num + 1
    end
end
print(num)

В Julia 0.7 (и в большинстве других языков) мы могли ожидать num = 1 после цикла.Тем не менее, это повлечет за собой UndefVarError: num not defined в Юлии 1,0.Я знаю, что с помощью let я могу сделать это

let
num = 0
for i = 1:5
    if i == 3
        num = num + 1
    end
end
print(num)
end

. Он выведет 1. Но я хочу получить num = 1 вне цикла и блок let.В некоторых ответах предлагается поместить весь код в блок let, но это повлечет за собой другие проблемы, включая UndefVarError при тестировании построчно.Есть ли способ вместо использования блокировки let?Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Просто помните, что внутри функции вы не будете использовать global, поскольку правила области действия внутри функции соответствуют ожиданиям:

function testscope()
    num = 0
    for i = 1:5
        if i == 3
            num = num + 1
        end
    end
    return num
end


julia> t = testscope()
1

Неожиданное поведение только в REPL.Подробнее об этом здесь

0 голосов
/ 19 сентября 2018

Это обсуждается здесь .

Добавьте global, как показано ниже внутри цикла для переменной num.

num = 0
for i = 1:5
    if i == 3
        global num = num + 1
    end
end
print(num)

Работа в Julia1.0.0 REPL:

julia> num = 0
0
julia> for i = 1:5
           if i == 3
               global num = num + 1
           end
       end
julia> print(num)
1

Редактировать

Для тех, кто приезжает сюда новичком в Юлии, следует отметить замечательный комментарий, сделанный vasja в ответе ниже:

Просто помните, что внутри функции вы не будете использовать глобальные, поскольку правила области действия внутри функции такие, как вы ожидаете:

См. Этот ответ для хорошегоПример использования функции для одного и того же кода без проблем с областью видимости.

...