• 元组赋值谜题


    来自流畅的python上记录的一道谜题

    >>> t = (1, 2, [30, 40])
    >>> t[2] += [50, 60]
    到底会发生下面 4 种情况中的哪一种?

    a. t 变成 (1, 2, [30, 40, 50, 60])。

    b. 因为 tuple 不支持对它的元素赋值,所以会抛出 TypeError 异常。

    c. 以上两个都不是。

    d. a 和 b 都是对的。

    正确答案:d

    书中作者环境为3.4、2.7,我在3.7中测试的结果也同样是d

    同样的,在使用extend为t[2]赋值时也是元祖改变,并未抛出异常

    作者在其中的解释我的理解是元组末尾是一个可变对象,增量运算符并不是一个原子操作,所以我们在对t[2]赋值之后,再赋值给t的过程中它终于发现了,这玩意不能被改变啊,所以立刻抛出异常,由于不是原子操作的原因,t[2]已经被改变,同样的,如果我们使用的是t[2] = t[2] + [50,60]这种操作的时候,元组t并不会发生改变。

    作者的三个教训:

    1.不要把可变对象放在元祖里。

    2.增量赋值不是一个原子操作。

    3.学会python的字节码很有必要。

  • 相关阅读:
    数字三角形W(加强版) codevs 2189
    数字三角形W(加强版) codevs 2189
    线段树模板
    树状数组模板 洛谷3374
    洛谷 2327 [SCOI2005]扫雷
    洛谷 2327 [SCOI2005]扫雷
    洛谷1144 最短路计数
    洛谷1144 最短路计数
    洛谷1346 电车
    洛谷1346 电车
  • 原文地址:https://www.cnblogs.com/slientbrain/p/10806818.html
Copyright © 2020-2023  润新知