【问题标题】:Why is a, b = 1 not allowed?为什么不允许 a, b = 1?
【发布时间】:2017-10-28 12:58:16
【问题描述】:

我想知道变量赋值以及为什么允许这样做:

a = 1, 2

a = b = 1

但这是不允许的:

a, b = 1

背后的逻辑是什么? 谢谢

【问题讨论】:

  • 结果会是什么?
  • a, b = 在某些情况下有效。例如,如果 x 是长度为 2 的可迭代对象,则 a, b = x 很好。在您的版本中,没有明确的含义。
  • 因为a, b = 1 意味着完全不同的东西?这在所有编程语言中都是通用的,使用不同的语法来完成不同的事情。
  • a = 1, 2 实际上创建了一个标识符为“a”的元组 (1,2),a ,b = 1 实际上期望右侧有一个可迭代对象,将 a 和 b 的值定义为第一个和第二个可迭代对象的元素。这很直观!

标签: python python-2.7 syntax


【解决方案1】:

我假设您可能熟悉像 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

【讨论】:

  • 对我来说,它看起来更像 math 而不是 C。在数学中,我会说“a,b = 1”并不罕见,意味着 a 和 b 都是1. Python 非常数学,例如还支持“1
【解决方案2】:

左右两边不对称。在

a = 1, 2

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

a, b = 1

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

你应该写a, b = 1, 2这样的东西。

【讨论】:

  • 也可能包括你得到一个TypeError: 'int' object is not iterable,并且该错误是由于python试图解压1而没有这样做的结果。
  • 我赞成这两个答案,因为它们都很好地解释了观察到的行为,尽管不同。
【解决方案3】:

在第一种情况下,python 假设 a 是 1 和 2 的元组

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

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

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

【讨论】:

    【解决方案4】:

    在 python 中,当你给出两个数字/字符串时,python 解释器认为它是一个元组

      a = 1, 2
    

    在上面一行中,您正在创建名为 a 的元组对象

     a, b = 1
    

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

    a,b = 1,1
    

    作品

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2011-05-30
      • 2014-03-29
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多