如果我在设置公共变量时切换顺序,结果为何不同?

2024-04-24 21:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

为了更好地解释,我编写了一个小类node,并设置了ab

class node(object):
    def __init__(self,x,y):
        self.val = x 
        self.next = y

a = node(5,6)
b = None

然后我发现结果不同于:

a, a.next, b = a.next, b, a
print(a,b)  #it returns AttributeError: 'int' object has no attribute 'next'

以及:

a.next, a, b = b, a.next, a
print(a,b)  #it returns 6 <__main__.node object at 0x1021a0400>

我们都知道,当a, b = b, a+b时,它同时给出a,b值,当代码变成b, a = a+b, b时,结果不变。你知道吗

有人能帮我吗?为什么会这样?你知道吗


Tags: selfnonenodeobjectinitdefitval
2条回答

拆包不是同时进行的。只是右手边在“拆包”到左手边之前是“构造”好的。但是每一边都是从左到右的!你知道吗

所以发生的事情大致是这样的(它实际上并不构建元组,但这只是一个实现细节):

tmp = (a.next, b, a)
a = tmp[0]
a.next = tmp[1]  # fails because "a" is now an integer
b = tmp[2]

在第二种情况下,它起作用是因为在“重新分配”a.next之后是“重新分配”:

tmp = (b, a.next, a)
a.next = tmp[0]  # a still has the next attribute
a = tmp[1]
b = tmp[2]

只有当LHS元素是独立的时,元组解包才会“同时”。既然您已经创建了一个它们不是独立的情况,那么实现中的小细节现在就很重要了。你知道吗

在这种情况下,重要的细节是LHS元素是从左到右分配的。由于在查看a.nexta包含int,因此会引发异常。你知道吗

import dis

def f1():
    a, a.next, b = a.next, b, a

def f2():
    a.next, a, b = b, a.next, a

print('f1:')
dis.dis(f1)
print()
print('f2:')
dis.dis(f2)

。。。你知道吗

f1:
  4           0 LOAD_FAST                0 (a)
              3 LOAD_ATTR                0 (next)
              6 LOAD_FAST                1 (b)
              9 LOAD_FAST                0 (a)
             12 ROT_THREE
             13 ROT_TWO
             14 STORE_FAST               0 (a)
             17 LOAD_FAST                0 (a)
             20 STORE_ATTR               0 (next)
             23 STORE_FAST               1 (b)
             26 LOAD_CONST               0 (None)
             29 RETURN_VALUE

f2:
  7           0 LOAD_FAST                0 (b)
              3 LOAD_FAST                1 (a)
              6 LOAD_ATTR                0 (next)
              9 LOAD_FAST                1 (a)
             12 ROT_THREE
             13 ROT_TWO
             14 LOAD_FAST                1 (a)
             17 STORE_ATTR               0 (next)
             20 STORE_FAST               1 (a)
             23 STORE_FAST               0 (b)
             26 LOAD_CONST               0 (None)
             29 RETURN_VALUE

相关问题 更多 >