【问题标题】:Initialize multiple lists in python [duplicate]在python中初始化多个列表[重复]
【发布时间】:2016-08-04 10:12:35
【问题描述】:
a = 2
b = 3
c = 4
x = y = z = [0 for i in xrange(a*b*c)]

有没有一种方法可以将 x,y,z 初始化为一行(因为我不想为每个列表初始化将 a、b 和 c 相乘),作为单独的列表0s。在上面,如果 x 被更新,那么 y 和 z 也会随着相同的变化同时更新。

【问题讨论】:

标签: python initialization generator-expression


【解决方案1】:

只需使用另一个理解并解压缩它:

x, y, z = [[0 for i in xrange(a*b*c)] for _ in xrange(3)]

注意[0 for i in xrange(a*b*c)] 等价于更简单的[0] * a*b*c

【讨论】:

  • 如何使用生成器以使列表实际上没有构建? a, b, c = ([0 for i in xrange(a*b*c)] for _ in xrange(3))
  • @DanielSanchez - 我们当然可以做到。但是,要从中获得任何性能优势,需要创建比在一行中解压缩成多个独立变量更多的列表。无论如何,它只需要存储引用,这些引用很小。
  • 请您进一步解释一下,我认为您正在构建包含另一个列表的列表,但您永远不会使用该列表。通过使用生成器,您只需摆脱该列表。我错了还是错过了什么?谢谢!!
  • @DanielSanchez - 它会去掉一个列表,是的,但是这个列表很小,而且它不应该只是很小的。
  • 你的意思是,好吧,不管怎样,我认为它不应该被使用,只是认为它处于 1000 次迭代的循环中,你将创建 1000 个列表,必须注意这一点。谢谢你的解释,很好的答案。
【解决方案2】:

看你陈述的意图,而不是“一条线”的要求:

a = 2
b = 3
c = 4
x = [0 for i in xrange(a*b*c)]
y = x [:]
z = x [:]

不确定优化器是否足够聪明以避免重复乘法:

x, y, z = [[0 for i in xrange(a*b*c)] for _ in xrange(3)]

假设 a、b 和 c 是属性,那么读取它们会产生副作用。优化器如何在动态类型语言中知道这一点?

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 2015-09-25
    • 2012-12-31
    • 2017-06-08
    • 2017-01-14
    • 2017-10-07
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多