python中的XOR交换算法?

Pra*_*are 3 python algorithm tuples

我试图在python中实现XOR交换.

x,y= 10,20

x,y,x = x^y,x^y,x^y

print('%s , %s'%(x,y))
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

30 , 30
Run Code Online (Sandbox Code Playgroud)

我不是python的新手,但我无法解释这个输出.它应该是20,10.

引擎盖下发生了什么?

Ign*_*ams 15

首先,创建一个由x^y,x^y和组成的元组x^y.然后将元组解压缩到x,y并且x,使两者都绑定到结果x^y.

保存自己的头痛,并以Pythonic方式做到:

x, y = y, x
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 10

虽然它肯定是最好的,正如其他答案所说的那样,x, y = y, x如果你对创建和解包元组过敏,你可以用连续的x-oring来做它......它只需要连续,而不是你正在做的同步!

>>> x = 1234
>>> y = 3421
>>> x ^= y
>>> y ^= x
>>> x ^= y
>>> print x
3421
>>> print y
1234
Run Code Online (Sandbox Code Playgroud)

xor-swap技巧的关键是三个连续的 xors,即一个一个 - ^=在这个片段中的三个单独的语句.当然,它没有任何实际意义,但是,如果你真的热衷于它,它确实有效,在Python中就像其他地方一样;-).

  • @Matthew,在Python**中每**整数运算**可能**"创建一个新对象" - 或者可能不会这样做:它完全取决于实现,因为它严格来说是一个性能问题(对语义没有任何影响! ),应用程序代码无法控制它.例如,可以缓存小的int**(因此实际上没有为int创建新对象<某些阈值,完全取决于Python实现),如果实现可以证明最后的引用,则可以重用现有对象的内存它被丢弃等等.你对创作的保证是错误的(更多......) (3认同)
  • @Matthew,详细回应你的海洋律师:"没有为临时变量使用额外的空间" - 这里没有使用额外的VARIABLE(可能有额外的OBJECTS - 不是变量但是不可变的 - 但绝对没有变量,所以我们没关系! - ).并且:如果一个对象是"执行环境中的数据存储区域",那么只要最后一个对象丢弃,Python对象就不再是对象了,因为这意味着它不是*在执行中环境* - 它可用于下面的底层实现**,可以随意使用(或不使用)环境. (2认同)
  • @Matthew,标识符的可用性与编译器使对象可访问的能力无关:例如,实现可以决定`__x`在任何范围内都是可见的,并返回一个允许访问所述对象的指针("保留给任何实现的对象)使用"按照17.4.3.2.1 in C++ std(2003),7.1.3 per C std(1999),以便使用正常",因此完全允许这些对象"在执行环境中",与你的断言相反.类似地,CPU(被视为其机器语言的实现)可以非常合法地在"执行环境"中分配xtra对象. (2认同)
  • 所有这一切的要点是你的"证明"Python不能进行XOR交换(因为如果值为1234和3421,给定的实现可能会分配额外的对象 - 尽管如果值为10和20则不会,根据OP的问题,例如在CPython中,因为很多版本)完全是假的:"可能分配额外的对象"(在执行环境中)取决于(任何机器语言的C语言的Python的实现),因此显然不能用来"推断"任何东西,反对你的愚蠢的主张. (2认同)