Python如何检查恰好有一个对象不为None

3

我有两个Python对象ab

最好/最有效/最符合Python风格的方法是什么,可以检查这些对象中恰好有一个是None


3
您似乎在问三个不同的问题。您想要最好的、最有效的还是最符合Python编程规范的?第一个和第三个属于个人观点,与主题无关。第二个可能并不重要:“过早优化是万恶之源”(http://c2.com/cgi/wiki?PrematureOptimization)。 - Barmar
如果不是? - pstatix
1
sum(x is None for x in (a,b)) == 1 这听起来有点过头了 :) - Jean-François Fabre
2
(a is None) != (b is None) - Barmar
@Jean-FrançoisFabre 在 Python 中使用布尔值作为数字进行交易,我知道它们确实是数字,但我们仍然利用它,这让我感到很不舒服,好像违反了类型规定一样。 - pcurry
1
布尔值是整数。True == 1False == 0。这是铁板钉钉的事实。 - Jean-François Fabre
2个回答

10

使用Python的^(异或)运算符。

(a is None) ^ (b is None)

1
我很矛盾,不知道使用!=是否更好。是的,对于布尔值,逻辑和按位异或是等效的,但还是... - juanpa.arrivillaga
@juanpa.arrivillaga 我也很纠结。当我想到“两个布尔值中只有一个为真”时,我自然而然地想到异或运算,但!=同样适用。 - Bill the Lizard
这就是为什么我在这里引用了旧的问题:https://dev59.com/SHRC5IYBdhLWcg3wCMg6 - pcurry
对我来说,问题在于按位运算符和逻辑运算符之间的区别。不幸的是,Python 没有逻辑异或运算符。当我看到代码中的按位 ^ 时,我会想“这里发生了一些按位操作”,但另一方面,!= 在我的脑海中并不立即表示“异或”。 - juanpa.arrivillaga
我进行了快速基准测试,^ 似乎稍微更有效率。 - Olivier Melançon

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接