*Memo:
- My post explains global and nonlocal with 3 classes and 3 functions (2).
- My post explains global and nonlocal with 3 classes and 3 functions (3).
- My post explains global and nonlocal with 3 functions (1).
- My post explains global and nonlocal with 3 functions (2).
- My post explains global and nonlocal with 3 functions (3).
- My post explains global and nonlocal with 2 classes and 3 functions (1).
- My post explains global and nonlocal with 2 classes and 3 functions (2).
- My post explains global and nonlocal with 2 classes and 3 functions (3).
- My post explains global and nonlocal with 2 functions or generators.
With 3 classes and 3 functions, there are 4 kinds of variables from the viewpoint of third()
as shown below:
- A global variable is the variable out of any functions and classes.
- A non-local variable is the variable within outer functions.
- A local variable is the variable which is within its function.
- A class variable is the variable within its class.
- A global and non-local variable can be accessed from a function as long as the function is called and run after them even if the function is defined before them as show in unintuitive version.
<Intuitive version>:
""" It's from the viewpoint of `third()` """
num = 2 # <- Global variable
print(num) # 2
class Cls1:
num = 3 # <- Class variable
print(num) # 3
def first(self):
num = 4 # <- Non-local variable
print(num) # 4
class Cls2:
num = 5 # <- Class variable
print(num) # 5
def second(self):
num = 6 # <- Non-local variable
print(num) # 6
class Cls3:
num = 7 # <- Class variable
print(num) # 7
def third(self):
num = 8 # <- Local variable
print(num) # 8
Cls3().third()
Cls2().second()
Cls1().first()
<Unintuitive version>:
""" It's from the viewpoint of `third()` """
class Cls1:
def first(self):
class Cls2:
def second(self):
class Cls3:
def third(self):
num = 8 # <- Local variable
print(num) # 8
num = 7 # <- Class variable
print(num) # 7
num = 6 # <- Non-local variable
print(num) # 6
Cls3().third()
num = 5 # <- Class variable
print(num) # 5
num = 4 # <- Non-local variable
print(num) # 4
Cls2().second()
num = 3 # <- Class variable
print(num) # 3
num = 2 # <- Global variable
print(num) # 2
Cls1().first()
A global statement can refer to a global variable as shown below:
*Memo:
- The doc explains the rules for local and global variables in Python.
<Read(Intuitive version)>:
""" It's from the viewpoint of `third()` """
num = 2 # <- 〇
class Cls1:
num = 3 # <- ✖
def first(self):
num = 4 # <- ✖
class Cls2:
num = 5 # <- ✖
def second(self):
num = 6 # <- ✖
class Cls3:
num = 7 # <- ✖
def third(self):
global num # Here
print(num) # 2
Cls3().third()
Cls2().second()
Cls1().first()
""" It's from the viewpoint of `third()` """
# num = 2 # <- Commented
class Cls1:
num = 3 # <- ✖
def first(self):
num = 4 # <- ✖
class Cls2:
num = 5 # <- ✖
def second(self):
num = 6 # <- ✖
class Cls3:
num = 7 # <- ✖
def third(self):
global num # NameError: name 'num' is not defined.
print(num) # Did you mean: 'self.num'?
Cls3().third()
Cls2().second()
Cls1().first()
<Read(Unintuitive version)>:
""" It's from the viewpoint of `third()` """
class Cls1:
def first(self):
class Cls2:
def second(self):
class Cls3:
def third(self):
global num # Here
print(num) # 2
num = 7 # <- ✖
num = 6 # <- ✖
Cls3().third()
num = 5 # <- ✖
num = 4 # <- ✖
Cls2().second()
num = 3 # <- ✖
num = 2 # <- 〇
Cls1().first()
""" It's from the viewpoint of `third()` """
class Cls1:
def first(self):
class Cls2:
def second(self):
class Cls3:
def third(self):
global num # NameError: name 'num' is not defined.
print(num) # Did you mean: 'self.num'?
num = 7 # <- ✖
num = 6 # <- ✖
Cls3().third()
num = 5 # <- ✖
num = 4 # <- ✖
Cls2().second()
num = 3 # <- ✖
# num = 2 # <- Commented
Cls1().first()
<Change(Intuitive version)>:
""" It's from the viewpoint of `third()` """
num = 2 # <- 〇
class Cls1:
num = 3 # <- ✖
def first(self):
num = 4 # <- ✖
class Cls2:
num = 5 # <- ✖
def second(self):
num = 6 # <- ✖
class Cls3:
num = 7 # <- ✖
def third(self):
global num # Here
num += 10 # Here
print(num) # 12
Cls3().third()
print(num) # 6
Cls2().second()
print(num) # 4
Cls1().first()
print(num) # 12
""" It's from the viewpoint of `third()` """
# num = 2 # <- Commented
class Cls1:
num = 3 # <- ✖
def first(self):
num = 4 # <- ✖
class Cls2:
num = 5 # <- ✖
def second(self):
num = 6 # <- ✖
class Cls3:
num = 7 # <- ✖
def third(self):
global num # NameError: name 'num' is not defined.
num += 10 # Did you mean: 'self.num'?
print(num)
Cls3().third()
print(num)
Cls2().second()
print(num)
Cls1().first()
print(num)
<Change(Unintuitive version)>:
""" It's from the viewpoint of `third()` """
class Cls1:
def first(self):
class Cls2:
def second(self):
class Cls3:
def third(self):
global num # Here
num += 10 # Here
print(num) # 12
num = 7 # <- ✖
num = 6 # <- ✖
Cls3().third()
print(num) # 6
num = 5 # <- ✖
num = 4 # <- ✖
Cls2().second()
print(num) # 4
num = 3 # <- ✖
num = 2 # <- 〇
Cls1().first()
print(num) # 12
""" It's from the viewpoint of `third()` """
class Cls1:
def first(self):
class Cls2:
def second(self):
class Cls3:
def third(self):
global num # NameError: name 'num' is not defined.
num += 10 # Did you mean: 'self.num'?
print(num)
num = 7 # <- ✖
num = 6 # <- ✖
Cls3().third()
print(num)
num = 5 # <- ✖
num = 4 # <- ✖
Cls2().second()
print(num)
num = 3 # <- ✖
# num = 2 # <- Commented
Cls1().first()
print(num)
Top comments (0)