列表理解中if / else的意外行为

时间:2015-10-06 16:30:24

标签: python

为什么会出现以下行为?我希望结果只有1。

declare @X xml;

if @X is not null
  set @X.modify('replace value of text()[1] with "1"');

由于In [77]: a = 1 In [78]: [a if a else s for s in [0, 1,0]] Out[78]: [1, 1, 1] 不为空,因此列表中的值应仅为a。 此处a只应在elsea时执行。

编辑:如果None不是a,我想在列表中插入a,否则在列表中插入None。< / p>

3 个答案:

答案 0 :(得分:2)

这是正常行为。您正在遍历包含三个数字的列表。 if a总是如此。因此,a if a执行三次。这就是为什么你将三个a添加到列表中的原因。

关于您的最新修改:

  

如果a不是None,我想在列表中插入一个,否则在列表中插入s。

好的,那么你这样做:

res=[]
if a:
    res.append(a)
else: 
    for s in [0,1,0]:
        res.append(s)

答案 1 :(得分:1)

a if a else s如果是真的,则评估为aa永远不会改变,所以无论你在列表理解中迭代什么,你都会得到同样的东西:a的列表,只要你迭代的是什么。

也许你想要这个?

[a] if a else [0, 1, 0]

如果a是真实的,则此表达式将评估为包含a的列表,否则它将评估为您提供的列表。

答案 2 :(得分:0)

没有必要将else放在括号内。

>>> a = 1
>>> [a] if a else [0, 1, 0]
[1]
>>> a = None
>>> [a] if a else [0, 1, 0]
[0, 1, 0]