Python:等式同时对多个变量的赋值说明

本文详细介绍了Python如何通过等式同时对多个变量进行赋值,以此实现变量交换。通过示例代码及执行过程的解释,强调了赋值操作遵循从左到右的顺序。并通过反转链表的案例进一步证明了这一规则,帮助理解Python赋值语句的执行机制。

Python可以利用等式对多个变量同时赋值,如: a, b, c = 1, 2, 3。利用这个特性可以很简洁的写出变量交换的代码:

a = 1
b = 2
a, b = b, a

执行上述代码后 a=2,b =1。这样就快速的完成了a,b变量之间的交换。

下面解释代码执行过程:

  1. 上述代码执行到第三行,先计算等式右边的b值,等式边为:a, b = 2, a
  2. 然后再计算等式右边的a值,等式边为:a, b = 2, 1
  3. 按从左到右的顺序对a, b 进行赋值计算,将a值边为2。
  4. 按从左到右的顺序对a, b 进行赋值计算,将b值边为1。

看到这记住上述结论即可,下面的验证过程有耐心就接着看。

验证代码如下:

def a():
    print('a')
    return 1


def b():
    print('b')
    return 2


def c():
    print('c')
    return 3


x, y, z = 0, 0, 0
x, y, z = a(), b(), c()
print(x, y, z)

#---------------------------
#代码执行结果为:
# a
# b
# c
# 1 2 3

由此可以看出,运算顺序是:先执行的是等式右边的表达式计算 按从左到右的顺序 执行等式右边的代码。

接着证明赋值的操作也是按从左到右的顺序执行:

# -*- coding:utf-8 -*-


class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head: return None
        before = None
        while head:
            # head, before, head.next = head.next, head, before    ERROR
            # head.next, before, head = before, head, head.next    RIGHT
            # head.next, head, before = before, head.next, head    RIGHT
            # head, head.next, before = head.next, before, head    ERROR
            try:
                print(head.val)
                print(head.next.val)
                print(before.val)
            except:
                pass
            head.next, before, head = before, head, head.next
            try:
                print(head.val)
                print(head.next.val)
                print(before.val)
            except:
                pass
        return before


# 新建链表
lst = [ListNode(1), ListNode(2), ListNode(3), ListNode(4), ListNode(5)]
for i in range(len(lst) - 1):
    lst[i].next = lst[i+1]

obj = Solution()
a = obj.reverseList(lst[0])
print(a.val)

这段代码是反转链表的代码,即将链表1->2->3->4->5 反转为链表 5->4->3->2->1。head.next, before, head = before, head, head.next
这行代码的写法有代码中注释里列出的4种写法。其中,1、4两种写法运行后报错,2、3两种写法运行后正确。原因在于赋值的过程是按从左到右的顺序执行的。

head, before, head.next = head.next, head, before 报错的代码为例:

  1. 程序开始,head指向第一个节点 1 。
  2. 先对head执行赋值操作,head更新后指向节点 2 。
  3. 再对head.next执行赋值操作,此时head.next 等价于 节点 2 -> next 。这行代码的本意是 更新 节点 1 ->next 的值。
  4. 因此这行代码运行后报错。
  5. 只有当head.next 赋值 操作 在 head 之前,代码才正常运行(2、3两种写法)。

由此证明,赋值操作顺序也是按从左到右执行。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值