【问题标题】:How does Python's comma operator work during assignment?Python 的逗号运算符在赋值过程中是如何工作的?
【发布时间】:2012-07-15 04:19:35
【问题描述】:

我正在阅读 Python 文档 (http://docs.python.org/reference/simple_stmts.html#assignment-statements) 中的赋值语句。

其中引用的是:

如果目标是括在括号或方括号中的目标列表:该对象必须是与目标列表中的目标具有相同数量的项目的可迭代对象,并且其项目从左到右分配,到相应的目标。

看完之后,我想到了写一个这样的示例:

a = 5
b = 4
a, b = a + b, a
print a, b

我的假设是 a 和 b 的值都应该是 9。

但是,事实证明我错了。 'a' 的值为 9,'b' 的值为 5。

有人可以帮助我更好地理解这一点吗?为什么分配“a”的旧值而不是新值?根据文档,将首先分配 a 的值,对吗?我错过了什么吗?

【问题讨论】:

    标签: python tuples variable-assignment comma


    【解决方案1】:

    赋值运算符右边的所有表达式在进行任何赋值之前都会被计算。

    来自Python tutorial: First steps towards programming

    第一行包含一个多重赋值:变量 a 和 b 同时获得新值 0 和 1。在最后一行再次使用它,证明 右侧的表达式都被计算首先在任何分配发生之前。右边的表达式是从左到右计算的。

    强调我的。

    您的代码在功能上等同于以下内容:

    a, b = 5 + 4, 5
    print a, b
    

    【讨论】:

    • 谢谢...这就解释了。你能给我一个或两个关于你的答案的链接吗?这将帮助我更清楚地理解事物。
    【解决方案2】:

    Python 没有 C 中的“逗号运算符”。相反,逗号表示应该构造一个元组。的右手边

    a, b = a + b, a
    

    是一个包含a + ba 两个项目的元组。

    在赋值的左侧,逗号表示应根据您引用的规则执行序列解包:a 将被分配元组的第一个元素,b 第二个元素。

    【讨论】:

      【解决方案3】:

      您可以认为分配在副本上并行发生,而不是按顺序和就地发生。

      这就是为什么在 python 中你不需要交换函数:

      a, b = b, a
      

      无需临时变量c即可充分工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        相关资源
        最近更新 更多