Python——语法糖:多重赋值(元组解包、迭代对象解包)问题及原理

Python 同时赋值问题

​ 在平时需要交换两个变量的值时,我们通常是这么写的

item = a
a = b
b = item

​ Python 中提供了一种更为简便的技巧,可以用同时给变量赋值,类似这种:

a, b = b, a

​ 这两种方式得到的结果是相同的,那如此神奇的代码,实现原理是什么呢?

原理

​ 在 Python 中,多重赋值的功能是通过迭代对象解包这一方法实现的,也被称作元组解包

a, b = 1, 2

​ 这行代码的意思是讲a设为1b2,在底层代码中,实际上是创建了一个(1, 2)的元组,通过遍历元组取到了12的值,分别赋给ab

​ 因为 Python 在中,元组两侧的括号实际上是可以省略的,即:

tup = 1, 2
print(tup)
# 输出:(1, 2)

​ 所以在多重赋值中,元组的()也可以被省略,便有了上边多重赋值的语法

​ 实际上,多重赋值也并不一定是通过元组,所有可迭代的对象都可以使用这种语法,例如:

a, b = [1, 2]
s1, s2 = 'ab'

通俗的讲

​ 如果理解不来底层的思想,我们可以这么理解多重赋值,即先确定=右边的值,再将其赋给左边

例子(反转链表)

​ 我们可以通过一个 Python 实现的反转链表来使用多重赋值,其他所有语言都需要设定一个临时变量来存储cur.next的值,而 Python 可以避免这种复杂的代码,Python 和 Java 的代码如下,请大家自行对比:

def reverseList(head):
    cur, prev = head, None
    while cur:
        # 多重赋值
        cur.next, prev, cur = prev, cur, cur.next
    return prev
public ListNode reverseList(ListNode head) {
    ListNode cur = head;
    ListNode pre = null;
    while (cur != null) {
        ListNode temp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;

总结

​ 多重赋值是 Python 一个很实用的语法糖,不仅可以简化代码的复杂程度,还可以大大提高代码的逼格!借汉奇大佬一句话多了解语言机制比学工具有用,奥里给!

发布了72 篇原创文章 · 获赞 89 · 访问量 6544

猜你喜欢

转载自blog.csdn.net/scfor333/article/details/104316694