2017-10-28 121 views
-1

我想知道变量分配和这是为什么允许:为什么a,b = 1不允许?

a = 1, 2 

a = b = 1 

,但这是不允许的:

a, b = 1 

什么是背后的逻辑? 谢谢

+3

结果会是什么? –

+2

'a,b ='在某些情况下有效。例如'a,b = x'很好,如果'x'是一个长度为2的迭代。在你的版本中没有明确的意思。 – Holloway

+0

因为'a,b = 1'意味着完全不同的东西?这在所有编程语言中都是通用的,使用不同的语法来完成不同的事情。 –

回答

3

我假设你可能熟悉C/C++这种静态类型的语言。这意味着初始化一个变量时必须声明一个变量的类型(例如,你会说int a;)。

在C/C++中,当你做int a, b = 1;(例如)时,你试图做的语法是有效的语法,因为我们将两个变量a和b初始化为整数,其中第二个变量是赋值为1.

但是,Python是一种动态类型化语言 - 变量的类型不需要声明。因此,当我们做a, b = 1时,我们实际上使用了一个叫做“解包”的Python特性。 Python正试图解压缩1变量ab - 但这是不可能的,因为1只是一个单一的数据 - 它不是一个列表或元组或什么。

因为Python是动态类型的,所以我们不能只是启动一个变量而不给它任何值(就像我们在做C时做的int a;)。当你做a, b = 1时,它试图遍历1并将其内容分配给变量ab。因此,错误TypeError: 'int' object is not iterable

+0

对我来说,它看起来更像*数学*而不是C。在数学中,我会说“a,b = 1”并不罕见,并且意味着a和b都是1.而且Python非常麻烦,例如也支持“1

1

左右侧不对称。在

a = 1, 2 

Python做包装的右侧参数。两个逗号分隔的参数创建元组,所以这相当于a = (1, 2)

随着

a, b = 1 

蟒蛇试图做拆包。它将右手表达式的第一个值分配给a,然后尝试将第二个值分配给b。由于没有第二个值,这将失败。它会将值1视为可迭代,因此会给出TypeError: int is not iterable

你应该写点像a, b = 1, 2

+1

可能还包括你得到一个'TypeError:'int'对象不是可迭代的',并且该错误是由于python试图解压'1'而导致的,并且没有这样做。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ:你说得对,我编辑了答案。 –

+0

我已经提出了两个答案,因为他们都很好地解释了观察到的行为,虽然不同。 –

0

在第一种情况下,蟒蛇假定为1元组和2

>>> a = 1, 2 
>>> a 
(1, 2) 

a, b = 1你想给值a和b,所以必须对他们是两个值,但你只提供一个即1。如果你有一个长度为2的迭代,那么它将工作。

>>> a, b = [6, 7] 
>>> a 
6 
>>> b 
7 
0

在蟒蛇当你给两个数/串,python解释认为它是一个元组

a = 1, 2 

在上述行正在创建的元组对象称为

a, b = 1 

在上面一行左边的语法是针对一个元组的,所以它的右边是元组值 所以

a,b = 1,1 

作品

相关问题