什么';列表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)
我的问题是,

  • 为什么它不在第三个输出上打印“Raymond”而不是“Guido”
  • 如何将其打印为: 雷蒙德打招呼


  • 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)