为啥执行两次 "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
视频说最终结果是x
和a
交换,如果我们再次这样做,它将在不改变任何变量值的原始位置。
我的问题是,如果我第一次分配a
=> x
和x
=> a
,那么即使我们执行完全相同的代码,代码的值也不会改变为我之前所做的相同变量分配相同的值。但是为什么视频中解释了a
和x
的值会被交换两次,并且在执行语句之前会得到相同的值呢?
【问题讨论】:
对于第一个问题,一旦你执行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
,那么a
和x
最终都会作为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" 不会导致值发生变化?的主要内容,如果未能解决你的问题,请参考以下文章
为啥L=wxw^R| w, x 属于 a,b^+ 是正则语言