【发布时间】:2017-01-19 11:36:49
【问题描述】:
在交换两个列表元素时,我总是创建一个额外的 temp 变量,并且我意识到下面的代码可以工作。 python 是否在计算之前在等号右侧创建内存 x[1],x[0]?谁能详细说明一下?
x = [1,2]
x[0], x[1] = x[1], x[0] #swap elements
print x
>>[2,1]
【问题讨论】:
标签: python
在交换两个列表元素时,我总是创建一个额外的 temp 变量,并且我意识到下面的代码可以工作。 python 是否在计算之前在等号右侧创建内存 x[1],x[0]?谁能详细说明一下?
x = [1,2]
x[0], x[1] = x[1], x[0] #swap elements
print x
>>[2,1]
【问题讨论】:
标签: python
首先计算右侧,结果是一个 new 元组。然后将元组解包并绑定到左侧的每个变量(列表的元素)。
这里使用的临时内存是 RHS 上的元组所需的内存。
请注意,项目是列表的元素这一事实并不重要——“独立”变量也会发生同样的情况。
由于您使用的是列表,因此可以使用切片来实现相同的效果,它还会创建一个临时列表并将其解包:
>>> x = [1, 2, 3, 4]
>>> x[:2] = x[1::-1]
>>> x
[2, 1, 3, 4]
【讨论】:
也许这能更好地说明发生了什么:
>>> a = 1, 2
>>> a
(1, 2)
>>> type(a)
<type 'tuple'>
如您所见,RHS 被“包装”在一个元组中,然后分配给a。
现在让我们看另一个例子,一个“解构”赋值:
>>> t = (1, 2)
>>> a, b = t
>>> a
1
>>> b
2
现在,如果您将两者结合起来,您应该了解您发布的示例中发生了什么。
【讨论】: