列表2 Python中发生了什么?

2024-09-28 17:20:21 发布

您现在位置:Python中文网/ 问答频道 /正文

 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)

如果我这样做?它打印以下内容:

>>> print(MyClass.hello())
Guido says hello
>>> print(MyClass.list_1) 
['Raymond', 'Raymond', 'Raymond']
>>> print(MyClass.list_2)
['Guido', 'Guido', 'Guido']

我的问题是,

  1. 为什么它不在第三个输出上打印“Raymond”而不是“Guido”
  2. 如何将其打印为:

    Raymond says hello


Tags: nameinhellofordefmyclassrangelist
1条回答
网友
1楼 · 发布于 2024-09-28 17:20:21

Python提供了两种不同的显示(可以非正式地称为文本的语法)来定义列表

list_1是一个“普通”列表显示,并使用name的最新绑定值

list_2是使用列表理解定义的,它是使用匿名函数实现的。现在name在该函数中是一个自由变量,因此它在最近的封闭范围内解析为name的值。由于class语句不建立新的作用域,因此它将是全局作用域,而不是class语句建立的临时命名空间

尽量避免在类定义中使用class属性作为“局部”变量

在类方法中,如果希望name成为类属性,而不是全局变量,则需要显式:

@classmethod
def hello(cls):
    return '{} says hello'.format(cls.name)

相关问题 更多 >