Две главных причины. Короче говоря, рассмотрите тщательно; могло быть серьезное основание для него, но если существует быть ОЧЕНЬ явным в Ваших комментариях, потому что это может быть хрупким и, поскольку Вы говорите, что себя, люди обычно не привыкли к наблюдению кода как это.
Во-первых, если Вы воздействуете на значения кроме false
и true
(или 0
и 1
, как целые числа), ^
оператор, может представить поведение, не эквивалентное логическому xor. Например:
int one = 1;
int two = 2;
// bitwise xor
if (one ^ two)
{
// executes because expression = 3 and any non-zero integer evaluates to true
}
// logical xor; more correctly would be coded as
// if (bool(one) != bool(two))
// but spelled out to be explicit in the context of the problem
if ((one && !two) || (!one && two))
{
// does not execute b/c expression = ((true && false) || (false && true))
// which evaluates to false
}
Кредит пользователю @Patrick для выражения этого сначала.
|
, &
, и ^
, как побитовые операторы, не закорачивают. Кроме того, несколько побитовых операторов, объединенных в цепочку вместе в отдельном операторе - даже с явными круглыми скобками - могут быть переупорядочены оптимизирующими компиляторами, потому что все 3 операции являются обычно коммутативными. Это важно, если порядок операций имеет значение.
, Другими словами
bool result = true;
result = result && a() && b();
// will not call a() if result false, will not call b() if result or a() false
будет не всегда давать тот же результат (или конечное состояние) как [1 120]
bool result = true;
result &= (a() & b());
// a() and b() both will be called, but not necessarily in that order in an
// optimizing compiler
, Это особенно важно, потому что Вы не можете методы управления a()
и b()
, или кто-то еще может приехать и изменить их позже не понимание зависимости и вызвать противное (и только часто сборка конечных версий) ошибка.
common = set(x[0])
for l in x[1:]:
common &= set(l)
print list(common)
or:
import operator
print reduce(operator.iand, map(set, x))
In one liner:
>>> reduce(set.intersection, x[1:], set(x[0]))
set([3, 4])