Reputation: 9393
CODE 1:
x=4
def func():
print("HELLO WORLD")
y=x+2
print (y)
print (x) # gives o/p as HELLO WORLD 6,4,4.
func()
print (x)
CODE 2:
x=4
def func():
print("HELLO WORLD")
y=x+2
x=x+2 # gives an error here
print (y)
print (x)
func()
print (x)
In the first code, it is not showing any error, it's adding the x
value to 2 and resulting back to y
and it prints the o/p as 6,4,4
. But Actually as I learnt so for, it should point an error because I am not giving the global declaration for x
variable inside the func()
. But its not ponting any error but in Code 2
it gives an error saying that x referenced before assignment
.
The question is can x
can be used for the assignment of its value to other variables? Even it is not followed with global declaration?
Upvotes: 1
Views: 168
Reputation: 34260
In the first function you haven't assigned to x, so the compiler doesn't treat it as a local variable. The runtime will automatically get x from the containing scope. You can easily inspect that x is not considered a local variable:
>>> func1.__code__.co_varnames
('y',)
In the 2nd function you're assigning to x, so the compiler treats it as a local variable:
>>> func2.__code__.co_varnames
('x', 'y')
Hence the error you see: UnboundLocalError: local variable 'x' referenced before assignment
.
Upvotes: 1
Reputation: 93040
You can read global variables without explicitly declaring them as global (Code 1)
But you are not allowed to assign to a global variable without explicitely declaring it as global. (Code 2)
This is because there is no harm in reading, but when assigning you might get unexpected behaviour (especially if it's a long code with many variables and you think it's a unique name you are using, but it's not).
Upvotes: 3