使用异或运算符交换数组不会’;我不能用Python工作

使用异或运算符交换数组不会’;我不能用Python工作,python,xor,Python,Xor,我试图用Python编写快速排序代码(请参阅问题末尾的完整代码),在分区函数中,我应该交换数组的两个元素(称之为x)。我使用以下代码基于xor运算符进行交换: x[i]^=x[j] x[j]^=x[i] x[i]^=x[j] 我知道,由于xor运算符的幂零性(即,x^x=0),它应该可以工作,而且我在Java和C中已经做了一百万次,没有任何问题。我的问题是:为什么它不能在Python中工作?当x[i]==x[j]时,它似乎不起作用(可能是i=j?) x=[2,4,3,5,2,5,46,2,5,

我试图用Python编写快速排序代码(请参阅问题末尾的完整代码),在分区函数中,我应该交换数组的两个元素(称之为
x
)。我使用以下代码基于xor运算符进行交换:

x[i]^=x[j]
x[j]^=x[i]
x[i]^=x[j]
我知道,由于xor运算符的幂零性(即,
x^x=0
),它应该可以工作,而且我在Java和C中已经做了一百万次,没有任何问题。我的问题是:为什么它不能在Python中工作?当
x[i]==x[j]
时,它似乎不起作用(可能是
i=j
?)

x=[2,4,3,5,2,5,46,2,5,6,2,5]
打印x
def部分(a、b):
全球x
i=a
对于范围(a,b)内的j:

如果x[j]至于它为什么不起作用,那真的不重要1,因为您一开始就是这样编写代码的,特别是当Python为您提供了非常好的“原子交换”功能时:

x[i], x[j] = x[j], x[i]
我一直认为,所有程序都应该首先针对可读性进行优化,只有在有明确需求和明显好处的情况下(我从来没有在一些非常小的数据环境(如一些嵌入式系统)之外看到过XOR技巧),才能对性能或存储进行改进

即使在没有提供这种漂亮特性的语言中,使用临时变量也更具可读性,可能更快:

tmp = x[i]
x[i] = x[j]
x[j] = tmp

1然而,如果你真的想知道它为什么不起作用,那是因为交换两个不同的变量可以用这个技巧,但是当你使用同一个变量时,效果就不太好了,这就是当你试图用
x[i]
交换
x[j]
时,当
i
等于
j
时你要做的事情

它在功能上等同于以下内容,添加了
print
语句,这样您就可以看到整个内容的不同之处:

>>> a = 42
>>> a ^= a ; print(a)
0
>>> a ^= a ; print(a)
0
>>> a ^= a ; print(a)
0
将其与两个不同的变量进行对比,这两个变量可以正常工作:

>>> a = 314159; b = 271828; print(a,b)
314159 271828

>>> a ^= b; print(a,b)
61179 271828

>>> b ^= a; print(a,b)
61179 314159

>>> a ^= b; print(a,b)
271828 314159
问题是,这个技巧是通过在两个变量之间逐渐传递信息来实现的(类似于谜题)。当它是同一个变量时,第一步不是传递信息而是破坏信息


Python的“原子交换”和使用临时变量都可以完全避免这个问题。

我在回顾这一事实,例如,您可以像下面的表达式一样表示xor:

a xor b = (a or b) - (a & b)
所以,基本上,如果你用b代替a,哇!xDD
你会明白的,零。

那么你的问题是什么?您是否得到了错误的输出?如果是这样的话,你应该在问题中包括这三条线,这三条线确实有效,所以问题出在其他地方。但正如帕斯迪亚布洛在回答中所说,你不应该这样交换。@AnandSKumar谢谢你的提问。我的问题是为什么它不起作用。如果我使用异或交换,我得到[0,0,0,0,0,0,0,0,2,5,5,6,46],如果我使用注释代码,我得到[2,2,2,2,3,4,5,5,5,5,5,5,6,46]@Cyphase感谢您的回复,问题就在这里。我使用了注释交换,它可以工作。@user16117,这很奇怪;我没有运行您的确切代码,但是
d=[1,2];d[0]^=d[1];d[1]^=d[0];d[0]^=d[1]
适合我
d
将是
[2,1]
。是的,您目前的最后一次更新,这确实是问题的关键所在,那么,我们为什么可以解释这种行为?这很奇怪,不是吗?谢谢你回答paxdiablo。为什么这不重要?我不是本地python程序员,也不习惯这些表达式。我知道它是这样工作的,我很感谢这方面的知识,但对我来说,这很重要,为什么/如何工作,为什么/如何不工作。@user16117如果你对任何具有相同数字的数字取
xor
,它会给你一个零。那你怎么能从零复制相同的数字呢?@niyasc Ah 0k,我现在明白了。我使用了完全相同的变量。谢谢:)@niyasc,问题不是数字相同,而是
x[i]
x[j]
指的是同一个变量
x[i]
可以等于
x[j]
,只要
i
不等于
j
a xor b = (a or b) - (a & b)