它在Python中是如何工作的? “a = a,b = b,a”

问题描述 投票:0回答:2
a = 10
b = 20

print(a, b)  # 10, 20
a = a, b = b, a  # How does it work?
print(a, b)  # 20, 10... Why?

很明显“a, b = b, a”会交换变量。但是“a =”在这种情况下会做什么以及为什么它不影响输出?

a = 10
b = 20

print(a, b)  # 10, 20

# a = a, b = b, a
a, b = b, a
a = a, b

print(a, b)  # (20, 10) 10
python python-3.x variables tuples
2个回答
0
投票

本质上, a = ... 部分不会改变交换行为。它只是将生成的元组分配回 a。 了解外部赋值的右侧计算结果为由内部赋值创建的元组 (b, a) 是至关重要的

这种赋值链在 Python 中是合法的,并且每个赋值操作都是从右到左发生的。

但是,虽然这种代码说明了 Python 的赋值行为,但它并不是执行变量交换的最可读或最推荐的方法(根据 PEP)。


0
投票

使用

dis
模块反汇编你得到的代码。

def foo():
    a = 10
    b = 20
    a = a, b = b, a

import dis

dis.dis(foo)
10 LOAD_FAST                1 (b)
12 LOAD_FAST                0 (a)
14 BUILD_TUPLE              2
16 COPY                     1
18 STORE_FAST               0 (a)
20 UNPACK_SEQUENCE          2
24 STORE_FAST               0 (a)
26 STORE_FAST               1 (b)

它首先将(b,a)存储到a中,然后将(b,a)的“旧值”解压到(a,b)中,从而将a覆盖为b而不是元组,本质上是在做

temp = b,a
a = temp
a,b = temp
© www.soinside.com 2019 - 2024. All rights reserved.