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

Python x、 y=getPos()vs.(x,y)=getPos(),python,tuples,Python,Tuples,考虑这个函数getPos(),它返回一个元组。以下两个作业的区别是什么?在某个地方我看到了一个例子,第一个作业被使用了,但当我刚刚尝试第二个作业时,我惊讶地发现它也起作用了。那么,这真的有区别吗,或者Python只是指出左边的部分应该是一个元组 def getPos(): return (1, 1) (x, y) = getPos() # First assignment x, y = getPos() # Second assignment 是的,它叫: “元组解包要求左侧的变量列

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

def getPos():
  return (1, 1)

(x, y) = getPos() # First assignment
x, y   = getPos() # Second assignment
是的,它叫:

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

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


是的,它在列表中也起作用

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

元组由许多用逗号(…)分隔的值组成

因此,括号并不能使一个元组成为一个元组。逗号起作用

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

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

没有区别。

没有区别:

>>> 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(左侧)中有一个元组用于元组解包:)

也可以创建一个单值元组:
(x,)
例如,
类型(1,2,3)
不会返回
tuple
@Skilldrick:当然,但这是因为
type
还接受三个参数:
type(name,base,dict)
。显然,如果要将元组传递给函数,必须使用括号。否则它们就是函数参数。@fortran:实际上,这不需要括号,但我想这是一个很好的做法,可以让它更清楚。下面是括号的一个常见用法:
用于枚举(点)中的索引(x,y):
。。。