Python 多重赋值似乎不会一次发生

python multiple assignment doesn't seem to occur at once

提问人:Silence 提问时间:7/29/2021 更新时间:7/29/2021 访问量:96

问:

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

n3=ListNode(3,n4)
n2=ListNode(2,n3)
n1=ListNode(1,n2)

n2,n2.next,n1=n2.next,n1,n2

如果同时发生,则 n2.next 应为 n1,但结果显示 n2.next=n3。这是否意味着在应用 n2=n2.next 后执行 n2.next=n1?我做错了什么?

Python 多重赋值

评论

1赞 S3DEV 7/29/2021
澄清一下,对你来说,“立即发生”的字面意思是发生在同一个确切的时间实例中?从计算上讲,这是不可能的。每个任务依次执行。
0赞 Silence 7/29/2021
谢谢。如果我将订单交换为 n2.next, n2, n1 = n1, n2.next, n2 它会提供所需的结果。我很困惑秩序如何产生差异
0赞 MisterMiyagi 7/29/2021
你是在问 Python 是否/如何一般地对赋值进行排序,还是在问为什么你的特定代码与顺序相关?

答:

2赞 Tasbiha 7/29/2021 #1

在 python 赋值语句中,始终在将值赋值到左侧之前计算右侧。计算右侧每个变量的结果,即 n2.next,n1,n2,使得 n2.next 为 3,n1 为 1,n2 为 2。然后,分配从左到右进行。

首先将 N2.next 分配给 N2,然后将 N1 分配给 N2.next,然后将 N2 分配给 N1。所以你是对的,它是按顺序进行的,而不是同时进行的。

0赞 Ram 7/29/2021 #2

Python 从左到右计算表达式。请注意,在评估作业时,右侧在左侧之前进行评估。 文档

分配按如下方式进行:

初始值:

n3 = ListNode(3,n4)
n2 = ListNode(2,n3)
n1 = ListNode(1,n2)
n2, n2.next, n1 = n2.next, n1, n2

右侧评价:

 A. n2.next = n3 = (3, n4)
 B. n1 = (1, n2)
 C. n2 = (2, n3)

从左到右分配

 1. Now n2 is n2.next which is n3. So n2 = (3, n4) {From A}
 2. n2.next is n1 i.e, n2.next = n1. So n2 = (3, n1) {From B}
 3. n1 is n2. So n1 = (2, n3) {From C}

所以最终值是:

n1 = (2, n3)
n2 = (3, n1)