Erik Garcia
Erik Garcia

Reputation: 98

Julia UndefVarError

for i in 1:2
    if i == 2
        print(x)
    end
    if i == 1
        x = 0
    end
end

UndefVarError : x not defined

Why does the code gives that error instead of printing 0 in julia?

While in python the following code print 0?

for i in range(2):
    if i==1:
        print(x)
    if i==0:
        x=0

Upvotes: 3

Views: 4503

Answers (2)

niczky12
niczky12

Reputation: 5063

Ignore my comment andgo with Bogumil's answer as that's is the real rwason why your x variable disapears in thesecond iteration.

If you want your code to work like in Python, you can add the global keyword to your assignment of x:

for i in 1:2
    if i == 2
        print(x)
    end
    if i == 1
        global x = 0
    end
end

Note that this is not recommended in most cases as it'll make your code performance suffer. Julia likes local variables that the compiler can optimise away easily.

Upvotes: 2

Bogumił Kamiński
Bogumił Kamiński

Reputation: 69869

The reason is because in the loop a variable gets a new binding each time a loop is executed, see https://docs.julialang.org/en/latest/manual/variables-and-scoping/#For-Loops-and-Comprehensions-1.

In fact while loop changed this behavior between Julia 0.6.3 and Julia 0.7 (in Julia 0.6.3 a new binding was not created). Therefore the following code:

function f()
    i=0
    while i < 2
        i+=1
        if i == 2
            print(x)
        end
        if i == 1
            x = 0
        end
    end
end

Gives the following output.

Julia 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

Julia 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 created a new binding already in Julia 0.6.3 at each iteration so it fails both under Julia 0.6.3 and Julia 0.7.0.

EDIT: I have wrapped the examples in a function, but you would get the same result if you executed the while loop in global scope.

Upvotes: 4

Related Questions