Python可以利用等式对多个变量同时赋值,如: a, b, c = 1, 2, 3。利用这个特性可以很简洁的写出变量交换的代码:
a = 1
b = 2
a, b = b, a
执行上述代码后 a=2,b =1。这样就快速的完成了a,b变量之间的交换。
下面解释代码执行过程:
- 上述代码执行到第三行,先计算等式右边的b值,等式边为:
a, b = 2, a。 - 然后再计算等式右边的a值,等式边为:
a, b = 2, 1。 - 按从左到右的顺序对a, b 进行赋值计算,将a值边为2。
- 按从左到右的顺序对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 报错的代码为例:
- 程序开始,head指向第一个节点 1 。
- 先对head执行赋值操作,head更新后指向节点 2 。
- 再对head.next执行赋值操作,此时head.next 等价于 节点 2 -> next 。这行代码的本意是 更新 节点 1 ->next 的值。
- 因此这行代码运行后报错。
- 只有当head.next 赋值 操作 在 head 之前,代码才正常运行(2、3两种写法)。
由此证明,赋值操作顺序也是按从左到右执行。
本文详细介绍了Python如何通过等式同时对多个变量进行赋值,以此实现变量交换。通过示例代码及执行过程的解释,强调了赋值操作遵循从左到右的顺序。并通过反转链表的案例进一步证明了这一规则,帮助理解Python赋值语句的执行机制。
1万+





