有和没有parens的元组之间的区别?

时间:2014-11-30 04:45:41

标签: python python-3.x

Elsewhere in the universe,关于在tuple周围使用parens的问题出现了。

  

“通过x = 1, 2声明元组是否有任何优势/劣势   而不是x = (1, 2)? ......关于速度和记忆   分配“

1 个答案:

答案 0 :(得分:3)

通常情况下,我建议用timeit来根据经验评估速度,但这让我感到非常真实。

果然,dis集会确认了这一点:

此处x = 1, 2

  6           0 LOAD_CONST               3 ((1, 2))
              3 STORE_FAST               2 (x)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE

x = (1, 2)

  9           0 LOAD_CONST               3 ((1, 2))
              3 STORE_FAST               2 (x)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE

如果人们好奇,如果某种相似性仅存在于由文字组成的tuple中,我也会x = a, b

 12           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_TUPLE              2
              9 STORE_FAST               2 (x)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE

x = (a, b)

 15           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_TUPLE              2
              9 STORE_FAST               2 (x)
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE

正如the source article中所引用的,Python的精细手册涵盖了可选parens的主题:

  

如您所见,输出元组始终用括号括起来,以便正确解释嵌套元组;虽然通常括号是必要的(如果元组是较大表达式的一部分),它们可能带有或不带有括号括号。

让我们放大一下为什么他们确实经常......必要的"" - 这是运营商优先权的问题。就像传统的书面算术有一个操作顺序一样,像Python这样的编程语言也是如此。它有助于我们将12 + 1 / 2(12 + 1) / 2区分开来。因此,在这种情况下,我们经常需要围绕tuple元素的括号,这些元素比简单nameliteral更复杂。因此,我们可以在下面的示例中看到两种不同的方法来解释使用元组的表达式。由于逗号的优先级低于乘法运算符(并且它们的关联性相同),所以当没有括号提供更明确的排序时,乘法首先发生。

>>> 12 * 4, 5
(48, 5)
>>> 12 * (4, 5)
(4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5)

关于parens和元组的脚注,也来自The Fine Manual

  

例外是空元组,需要括号 - 在表达式中允许不带括号的“无”会导致含糊不清并允许常见错别字传递未被捕获。

资源:https://gist.github.com/androm3da/8a646fbe817d576b1f0d