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