我找到了制作循环列表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, []]]
,但我不明白为什么以及如何避免这个问题
答案 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)
现在选择最适合您的需求。