x,y = getPos()vs.(x,y)= getPos()

时间:2010-10-15 10:31:26

标签: python tuples

考虑这个函数getPos(),它返回一个元组。以下两项任务有什么区别?在某个地方,我看到了一个使用第一个任务的例子,但是当我尝试第二个任务时,我很惊讶它也有效。那么,真的有区别吗,或者Python只是发现左手部分应该是一个元组?

def getPos():
  return (1, 1)

(x, y) = getPos() # First assignment
x, y   = getPos() # Second assignment

5 个答案:

答案 0 :(得分:8)

了解tuples

  

元组由许多以逗号(...)

分隔的值组成

因此,括号不会使元组成为元组。逗号做了。

只有在您拥有奇怪的嵌套结构时才需要括号:

x, (y, (w, z)), r

答案 1 :(得分:5)

是的,它被称为tuple unpacking

  

“元组解包需要左边的变量列表与元组的长度具有相同的元素数。” - Guido Van Rossum

     

“当你在=的左侧使用元组或列表时,Python将右侧的对象与左侧的目标配对,并从左到右分配它们。” - Lutz和Ascher

答案 2 :(得分:4)

没有区别:

>>> import dis
>>> dis.dis(compile("a,b = expr()", "", "single"))
  1           0 LOAD_NAME                0 (expr)
              3 CALL_FUNCTION            0
              6 UNPACK_SEQUENCE          2
              9 STORE_NAME               1 (a)
             12 STORE_NAME               2 (b)
             15 LOAD_CONST               0 (None)
             18 RETURN_VALUE        
>>> dis.dis(compile("(a,b) = expr()", "", "single"))
  1           0 LOAD_NAME                0 (expr)
              3 CALL_FUNCTION            0
              6 UNPACK_SEQUENCE          2
              9 STORE_NAME               1 (a)
             12 STORE_NAME               2 (b)
             15 LOAD_CONST               0 (None)
             18 RETURN_VALUE        

a, b(a, b)都指定了一个元组,你需要在LHS(左手边)中使用元组进行元组解包:)

答案 3 :(得分:3)

是的,它也适用于列表

>>> x,y,z = range(3)
>>> print x, y, z
0 1 2
>>> 

答案 4 :(得分:1)

没有区别。