首页 > 解决方案 > list_2 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. 如何使其打印为:

    雷蒙德打招呼

标签: pythonpython-3.xlistloopsclass

解决方案


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

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

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

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

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

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

推荐阅读