【问题标题】:How Python's a, b = b, a works? [duplicate]Python 的 a, b = b, a 是如何工作的? [复制]
【发布时间】:2015-02-09 11:39:13
【问题描述】:

我知道我的会看起来微不足道,但我无法弄清楚为什么“停止”不等于零,因为“开始”值已经被覆盖。但是当我从函数中模拟相同的场景时,它确实如此覆盖它。我在这里遗漏了什么吗?

def interval(start, stop =None, step = 1 ):
    'Imitates range() for step >0 '
    if stop is None:
        start, stop = 0, start #since start is already 0, why isn't stop as well?
        print start,stop , step
    result = []
    i = start
    while i< stop:
        result.append(i)
        i+=step 
    return result

【问题讨论】:

    标签: python python-internals


    【解决方案1】:

    这个表达式

    start, stop = 0, start
    

    不会像这样评估

    start = 0
    stop = start
    

    但是将通过将两个值都压入堆栈来进行评估,并且将旋转前两个值(以便交换值)并将值分配回startstop。让我们考虑一下,

    a = 1
    a, b = 0, a
    

    如果我们查看反汇编代码

    import dis
    dis.dis(compile("a = 1; a, b = 0, a", "<string>", "exec"))
    

    看起来像

      1           0 LOAD_CONST               0 (1)
                  3 STORE_NAME               0 (a)
                  6 LOAD_CONST               1 (0)
                  9 LOAD_NAME                0 (a)
                 12 ROT_TWO
                 13 STORE_NAME               0 (a)
                 16 STORE_NAME               1 (b)
                 19 LOAD_CONST               2 (None)
                 22 RETURN_VALUE
    

    LOAD_* 操作会将内容加载到堆栈中。如果你看

                  6 LOAD_CONST               1 (0)
                  9 LOAD_NAME                0 (a)
    

    0a 中的值被压入堆栈,然后ROT_TWO 旋转堆栈顶部两个位置的值。最后

                 13 STORE_NAME               0 (a)
                 16 STORE_NAME               1 (b)
    

    将旋转后的值分别分配给ab

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 2019-10-27
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2013-11-19
      • 2013-10-07
      相关资源
      最近更新 更多