自动生成的列表无法正常运行

时间:2018-10-20 10:28:42

标签: python list loops

我找到了制作循环列表here的好方法。代码会按照我的需要运行。

x=["alpha","betta", "gamma"]
y=[[] for _ in range(len(x))]
y[1]=3

将按预期方式给我[[], 3, []]。但是当我尝试升级代码时:

z=[10,20,30]
x=["alpha","betta"]
y=[[] for _ in range(len(z))]
y=[y for _ in range(len(x))]
y[1][1]=4

会给我正确的形状,但我会得到[[[], 4, []], [[], 4, []]]

我显然没有陷入链接中提到的陷阱,而没有[[[], [], []], [[], 4, []]],但我不明白为什么以及如何避免这个问题

2 个答案:

答案 0 :(得分:3)

这是您的代码出错的地方:

y=[y for _ in range(len(x))]

因为您实际上是在创建指向同一列表(即y)的两个指针。相反,您可以尝试这样的事情:

y=[y.copy() for _ in range(len(x))]

自创建新列表以来,这可以解决您的问题。

答案 1 :(得分:1)

this solution解决了您所展示的问题,但是如果您执行此操作怎么办:

// ...   
//define subquery
$qb2->select('CONCAT(somedb1.configId, \'\' ,MAX(somedb1.version)');
$qb2->from('DataObjects\Entities\someDB', 'somedb1');
$qb2->where('somedb1.template = :variable');
$qb2->groupBy('somedb1.configId');


//define mainquery
$qb->select('somedb');
$qb->from('DataObjects\Entities\someDB', 'somedb');
$qb->where($qb->expr()->in('CONCAT(somedb.configId, \'\', somedb.version)', $qb2->getDQL()));

$qb->setParameter("variable" , $variable);

在这里,我使用列表引用而不是覆盖它,所以我得到了:

y=[[] for _ in range(len(z))]
y=[y.copy() for _ in range(len(x))]
y[1][1].append(12)

该死。为什么这个?因为[[[], [12], []], [[], [12], []]] 创建了 shallow 副本,所以您需要copy

deepcopy

打印:

import copy
y=[copy.deepcopy(y) for _ in range(len(x))]
y[1][1].append(12)

现在选择最适合您的需求。