Let's consider the code below.
name = "John"
class MyClass:
    name = "Tom"
    list_1 = [name] * 2
    list_2 = [name for i in range(2)]
On first look, one might expect list_1 and list_2 to both have the same
content: ["Tom", "Tom"], but this is not the case. list_1 evaluates to
["Tom", "Tom"], whereas list_2 evaluates to ["John", "John"].
I read that when a function is nested inside a class, Python will use variables defined in the module scope and not in the class scope. list_1 is not a function, so it uses name from the class scope, whereas list_2 is a function and, therefore, uses name from the module scope. I understand this is how it works, but it seems counter-intuitive. I don't understand the reason.
 
    