【问题标题】:Assignment statement value赋值语句值
【发布时间】:2011-10-24 04:09:52
【问题描述】:

每个人都知道在 Python 中赋值不会返回值,大概是为了避免在通常只是比较的情况下对 if 语句进行赋值:

>>> if a = b:
  File "<stdin>", line 1
    if a = b:
         ^
SyntaxError: invalid syntax

>>> if a == b:
...     pass
...

出于同样的原因,人们可能会怀疑同一语句上的多个赋值也是语法错误。

事实上,a = (b = 2) 不是一个有效的表达式:

>>> a = (b = 2)
  File "<stdin>", line 1
    a = (b = 2)
           ^
SyntaxError: invalid syntax

所以,我的问题是:为什么 a = b = 2 在 Python 中工作,因为它在赋值语句有值的其他语言中工作,比如 C?

>>> a = b = c = 2
>>> a, b, c
(2, 2, 2)

是否记录了这种行为?我在赋值语句文档中找不到任何关于此的内容:http://docs.python.org/reference/simple_stmts.html#assignment-statements

【问题讨论】:

    标签: python variable-assignment


    【解决方案1】:

    就在语法中:

    assignment_stmt ::=  (target_list "=")+ (expression_list | yield_expression)
    

    (target_list "=")+ 末尾的小+ 表示“一个或多个”。所以a = b = c = 2 行不是由 3 个赋值语句组成,而是由单个赋值语句和 3 个目标列表组成。

    每个目标列表依次只包含一个目标(在本例中为标识符)。

    它也在文本中(强调我的):

    赋值语句 [...] 将单个结果对象从左到右分配给每个目标列表

    这可能会导致有趣的结果:

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

    【讨论】:

      【解决方案2】:
      a = b = c = 2
      b = 3
      print a,b,c
      >>> 2 3 2
      

      【讨论】:

        【解决方案3】:

        另一个很好的例子:

        >>a,b,c  = b = 1,2,3
        >>b
        (1, 2, 3)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          • 2011-10-30
          • 1970-01-01
          • 1970-01-01
          • 2015-07-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多