什么';列表2 Python中发生了什么?
如果我这样做?它打印以下内容:什么';列表2 Python中发生了什么?,python,python-3.x,list,loops,class,Python,Python 3.x,List,Loops,Class,如果我这样做?它打印以下内容: name = 'Guido' class MyClass: name = 'Raymond' list_1 = [name] * 3 list_2 = [name for i in range(3)] @classmethod def hello(cls): return '{} says hello'.format(name) 我的问题是, 为什么它不在第三个输出上打印“Raymond”
name = 'Guido'
class MyClass:
name = 'Raymond'
list_1 = [name] * 3
list_2 = [name for i in range(3)]
@classmethod
def hello(cls):
return '{} says hello'.format(name)
我的问题是,
Python提供了两种不同类型的显示(可以非正式地称为文本的语法)来定义列表
list_1
是一个“普通”列表显示,并使用最近绑定的值作为name
list_2
是使用列表理解定义的,它是使用匿名函数实现的。现在,name
是该函数中的自由变量,因此它解析为最近封闭范围内的name
值。由于class
语句不建立新的作用域,因此它将是全局作用域,而不是由class
语句建立的临时命名空间
尽量避免在类定义中使用class
属性作为“局部”变量
在class方法中,如果希望name
成为class属性,而不是全局变量,则需要显式:
>>> print(MyClass.hello())
Guido says hello
>>> print(MyClass.list_1)
['Raymond', 'Raymond', 'Raymond']
>>> print(MyClass.list_2)
['Guido', 'Guido', 'Guido']
@classmethod
def你好(cls):
return“{}says hello”。format(cls.name)
请不要添加行号,复制/粘贴代码会让您的代码更加繁琐。可能的重复:谢谢您的提醒,我已经删除了它!深度空间,但我不能静止!当我使用函数时,为什么工作方式会有所不同?e、 g.def func():name='Raymond';l1=[名称]*3;l2=[范围(3)中的uu的名称];返回l1,l2
,在全局中打印l1
和l2
时,它们都是“Raymond”的x3。函数定义了一个新范围;一个class
声明就不需要了。谢谢@chepner,范围界定的内在细微差别不是我的强项。今天学到了一些新东西。事实上现在我想起来了,为什么class
语句不定义一个新的作用域呢?函数定义只保存每次调用函数时要执行的主体。但是,类定义会立即执行class语句体,并在语句完成后丢弃。由任何代码计算并分配给名称的值都用作类属性,但代码本身不保留。它遵守该规则。然而,class
语句没有创建作用域,因此class属性根本不适用。list_2
中的立即作用域是匿名函数的局部作用域,由于那里没有定义name
,因此它在最近的封闭作用域中查找,这是全局作用域(因为class
语句没有定义作用域)。class
语句确实定义了一个临时名称空间,这是一个与范围不同的概念。
@classmethod
def hello(cls):
return '{} says hello'.format(cls.name)