为啥执行两次 "a, x = x, a" 不会导致值发生变化?

Posted

技术标签:

【中文标题】为啥执行两次 "a, x = x, a" 不会导致值发生变化?【英文标题】:Why doesn’t executing "a, x = x, a" twice result in a change of values?为什么执行两次 "a, x = x, a" 不会导致值发生变化? 【发布时间】:2016-11-03 15:45:10 【问题描述】:

在观看 video 解释测验时,我发现了这个代码 sn-p:

a, x = x, a
a, x = x, a
print a
print x

视频说最终结果是xa 交换,如果我们再次这样做,它将在不改变任何变量值的原始位置。

我的问题是,如果我第一次分配a => xx => a,那么即使我们执行完全相同的代码,代码的值也不会改变为我之前所做的相同变量分配相同的值。但是为什么视频中解释了ax的值会被交换两次,并且在执行语句之前会得到相同的值呢?

【问题讨论】:

对于第一个问题,一旦你执行x = a,如果x 没有分配到其他地方,你就失去了它的价值,所以他们不能交换。您将需要第三个变量(通常称为 temp 之类的东西)来保存 x 的值以进行交换;除非我错过了某种边缘技术来实现这一点。 a = x, x = a 是一个错误。你的意思是a,x = x,a @Carcigenicate 您可以轻松地使用 a,x = x,a 来不需要临时变量。 @JohnGordon 对不起。我的意思是a,x = x,a。我会编辑它。 @Whud 必须隐含地创建第三个变量,不是吗?我以前从未在 Python 中这样做过,但同样,一旦您覆盖 a,该值就消失了。如果 Python 在后台制作副本,那么我想这会起作用。 【参考方案1】:

a,x = x,a 语法交换了值,因为赋值运算符 (=) 右侧的赋值首先被求值,然后被赋值给它们的值,正如 here 解释的那样。从逻辑上讲,如果此操作执行两次,则第二次交换会将变量返回到其原始值。

请注意,如果您改为编写a = x; x = a,那么ax 最终都会作为x 的起始值,因为每个语句都是从左到右按顺序计算的。

演示:

>>> a = 1
>>> x = 2
>>> a,x = x,a
>>> a,x
(2, 1)
>>> 
>>> a = 1
>>> x = 2
>>> a = x; x = a
>>> a,x
(2, 2)

【讨论】:

从语法上讲,a,x = x,a 的右侧创建了一个包含两个元素的元组,然后左侧将元组解包为两个变量。但是,从 Python 2.6 开始,内部优化会识别这个常见的习惯用法,并跳过元组的创建。

以上是关于为啥执行两次 "a, x = x, a" 不会导致值发生变化?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs的一个疑问,为啥req被执行了两次

为啥L=wxw^R| w, x 属于 a,b^+ 是正则语言

为啥“x”的值发生了变化? [复制]

c语言请问while循环为啥执行不了?

为啥我用ajax请求后台会请求两次,一次get,一次OPTIONS,求解决

形参不能改变实参,为啥在用指针传递数值的时候又可以改变呢?