在我用Python编写代码时,每隔一段时间就会出现以下情况:
我遍历循环并发现我想将变量的中间值存储在列表中以供稍后使用。以下是一个非常基本的示例代码:
for x in range(0,10):
y = x*x
temp_list.append(y)
问题是temp_list
尚未宣布。所以我通常会导航到循环的顶部,然后添加以下内容:
temp_list = []
for x in range(0,10):
y = x*x
temp_list.append(y)
虽然这可能看起来微不足道,但我只是想知道是否有任何pythonic方法来创建一个列表,如果它不存在然后追加一个值,否则如果它存在,只需追加?
答案 0 :(得分:8)
对于你的基础样本,可以使用列表理解来完成:
l = [x*x for x in range(0, 10)]
答案 1 :(得分:3)
应该始终清楚是否声明了变量。您希望如何访问它?
你可以动态做的是一个词典:
a = {}
for x in range(0,10):
y = x*x
a.setdefault('temp_list', []).append(y)
仅在需要时才会创建a['temp_list']
。
答案 2 :(得分:2)
根据您的问题,处理这种结构的良好“pythonic”方式可能是将其抽象为生成器。对于你的小例子:
def squares():
for x in range(0,10):
y = x*x
yield y
然后:
temp_list = [i for i in squares()]
当你需要一个像这样的临时列表时,很常见,因为你正在对数据运行一系列操作,每个操作都涉及另一个循环。使用生成器可以显着提高性能和内存使用率,因为它们只会产生一个循环。
请注意,对于简单的示例,通常更容易编写生成器表达式:
temp_list = (x*x for x in range(0, 10))
如果你想要一种不那么pythonic的方式,你可以编辑locals字典,但这不是一个好主意,因为它会导致混淆的代码:
for x in range(0, 10):
y = x*x
locals().setdefault('temp_list', []).append(y)
答案 3 :(得分:0)
另一种根据 OPs 模板使用 locals 的方法,
for x in range(0,10):
y = x * x
temp_list = temp_list + [y] if "temp_list" in locals() else [y]
print(temp_list)
给予,
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[Program finished]
但是是的,这应该可以通过列表理解来解决