Алгоритм обмена XOR имеет смысл, только если у вас есть два указателя на изменяемые объекты. a и b являются двумя ссылками на неизменяемые целые числа.
РЕДАКТИРОВАТЬ (переход от комментариев к запросу и расширение):
Целые числа Python неизменны. Таким образом, каждый раз, когда вы «модифицируете» один с помощью XOR, будет выделяться новое хранилище (или повторно использоваться, например, для интернирования). Это принципиально отличается от (например, C), где swap изменяет значение без выделения новой памяти. Иными словами, подкачка XOR не создает новые объекты в смысле C99 («область хранения данных в среде выполнения, содержимое которой может представлять значения») или в смысле Python. Как отмечено здесь , настоящий XOR-своп может «обмениваться значениями переменных a и b без использования дополнительного пространства для временной переменной».
Или опытным путем:
>>> x = 3
>>> y = 5
>>> print "x: ", x, ", id(x): ", id(x), "y: ", y, ", id(y): ", id(y)
x: 3 , id(x): 137452872 y: 5 , id(y): 137452848
>>> x ^= y
>>> print "x: ", x, ", id(x): ", id(x), "y: ", y, ", id(y): ", id(y)
x: 6 , id(x): 137452836 y: 5 , id(y): 137452848
>>> y ^= x
>>> print "x: ", x, ", id(x): ", id(x), "y: ", y, ", id(y): ", id(y)
x: 6 , id(x): 137452836 y: 3 , id(y): 137452872
>>> x ^= y
>>> print "x: ", x, ", id(x): ", id(x), "y: ", y, ", id(y): ", id(y)
x: 5 , id(x): 137452848 y: 3 , id(y): 137452872
В этом случае мы видим, что интерпретатор (2.6.4) выглядит как , заключающий целые числа , поэтому x заканчивается адресом памяти, который изначально имел y Но главное в том, что для свопинга требуется как минимум одно выделение (137452836), а x и y не сохраняют один и тот же адрес памяти.
В С:
int x = 3;
int y = 5;
printf("x: %d, &x: %p, y: %d, &y: %p\n", x, &x, y, &y);
x ^= y;
printf("x: %d, &x: %p, y: %d, &y: %p\n", x, &x, y, &y);
y ^= x;
printf("x: %d, &x: %p, y: %d, &y: %p\n", x, &x, y, &y);
x ^= y;
printf("x: %d, &x: %p, y: %d, &y: %p\n", x, &x, y, &y);
дает:
x: 3, &x: 0xbfd433ec, y: 5, &y: 0xbfd433e8
x: 6, &x: 0xbfd433ec, y: 5, &y: 0xbfd433e8
x: 6, &x: 0xbfd433ec, y: 3, &y: 0xbfd433e8
x: 5, &x: 0xbfd433ec, y: 3, &y: 0xbfd433e8
Это настоящий XOR-своп, поэтому x и y всегда сохраняют одни и те же области памяти, а временные нет.