python - 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']
我的问题是,
- 为什么不在第三个输出上打印“Raymond”而不是“Guido”。
- 如何使其打印为:
雷蒙德打招呼
解决方案
Python 提供了两种不同类型的显示(可以非正式地称为文字的语法)来定义列表。
list_1
是一个“普通”列表显示,并使用最近绑定的值name
。
list_2
使用列表推导定义,该推导使用匿名函数实现。Nowname
是该函数中的一个自由变量,因此它解析为name
最近封闭范围内的值。因为一个class
语句没有建立一个新的范围,那将是全局范围,而不是语句建立的临时命名空间class
。
尽量避免class
在类定义中使用属性作为“局部”变量。
在类方法中,如果要name
成为类属性,而不是全局变量,则需要显式:
@classmethod
def hello(cls):
return '{} says hello'.format(cls.name)
推荐阅读
- webrtc - WebRTC NTP 服务器
- c# - 在 C# 中创建一个从字典中返回值的方法
- r - 在R中将整数转换为时间
- python - 使用 iloc 和 iterrow 在 Pandas 中设置WithCopyWarning
- visual-studio-code - 在 Python 虚拟环境 VSCode 中探索和搜索文件
- oracle - 有没有办法在 PL SQL 中本地缓存和过滤表?
- angular - Angular 9 - 提供了重复的列定义名称 - detailExpand
- django - 使用变量返回重定向
- c - 切换案例以在 c 中找到最大值或相等不起作用
- django - get_context_data 方法 Django