我尝试在Python中实现XOR交换算法。
x,y= 10,20
x,y,x = x^y,x^y,x^y
print('%s , %s'%(x,y))
输出:
30 , 30
我对 Python 并不陌生,但是我无法解释这个输出。输出应该是 20,10
。
底层发生了什么?
我尝试在Python中实现XOR交换算法。
x,y= 10,20
x,y,x = x^y,x^y,x^y
print('%s , %s'%(x,y))
输出:
30 , 30
我对 Python 并不陌生,但是我无法解释这个输出。输出应该是 20,10
。
底层发生了什么?
首先创建一个由x^y
, x^y
和x^y
组成的元组。然后将该元组解包到x
,y
和x
中,导致两者都绑定到x^y
的结果。
避免头痛,请按照Pythonic的方式操作:
x, y = y, x
x, y = y, x
在底层是如何运作的? - Anirban Nag 'tintinmj'虽然像其他答案所说,最好使用x, y = y, x
的方法,但是如果你对创建和拆分元组过敏,你仍然可以通过连续进行异或操作来做到...只要是连续的,而不是同时的!
>>> x = 1234
>>> y = 3421
>>> x ^= y
>>> y ^= x
>>> x ^= y
>>> print x
3421
>>> print y
1234
xor-swap技巧的关键在于进行三次连续的异或操作,即按照顺序执行三条^=
语句,就像这个片段中所示。当然,这在实践中没有任何意义,但如果你真的很想尝试,它在Python和其他任何地方都是可以正常工作的;-)。
__x
在任何范围内可见,并返回指针以允许访问该对象(根据C++ std(2003)17.4.3.2.1,C std(1999)7.1.3,“保留给实现任何用途”,因此该用法是可以的),因此这些对象完全可以“在执行环境中”,与您的说法相反。同样,CPU(视为其机器语言的实现)可以合法地分配额外的对象“在执行环境中”。 - Alex Martelli>>> x, y = 10, 20
>>> x = x ^ y; print x, y
30 20
>>> y = x ^ y; print x, y
30 10
>>> x = x ^ y; print x, y
20 10
>>>
您需要阅读维基百科文章的其余部分,该文章解释了正确实现会阻止并行操作,并且整个想法在现代计算机架构上基本上是无用的。
>>> 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
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
你可以使用以下方法轻松地进行交换:
x, y = 10, 20 x, y = y, x print((x,y))
至于你看到的行为,我很确定那是因为整个右侧表达式被同时评估并分配给左侧,而在这种情况下x^y
始终为30。
x, y = 10, 20
print('Before swapping: x = %s, y = %s '%(x,y))
x, y = x ^ x ^ y, x ^ y ^ y
print('After swapping: x = %s, y = %s '%(x,y))
或者
x, y = 10, 20
print('Before swapping: x = %s, y = %s '%(x,y))
print('After swapping: x = %s, y = %s '%(x ^ x ^ y, x ^ y ^ y))
输出:
Before swapping: x = 10 , y = 20
After swapping: x = 20 , y = 10
x, y = y, x
带有一些冗余的异或操作;x ^ x
和 y ^ y
都等于零。 - kaya3