链式作业如何工作?

新手上路,请多包涵

引用某事:

 >>> x = y = somefunction()

是相同的

>>> y = somefunction()
>>> x = y

问题:是

x = y = somefunction()

x = somefunction()
y = somefunction()

根据我的理解,它们应该相同,因为 somefunction 只能返回一个值。

原文由 q0987 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 473
2 个回答

如果 somefunction 返回可变值,它们不一定会工作相同。考虑:

 >>> def somefunction():
...     return []
...
>>> x = y = somefunction()
>>> x.append(4)
>>> x
[4]
>>> y
[4]
>>> x = somefunction(); y = somefunction()
>>> x.append(3)
>>> x
[3]
>>> y
[]

原文由 Wilduck 发布,翻译遵循 CC BY-SA 3.0 许可协议

先左

x = y = some_function()

相当于

temp = some_function()
x = temp
y = temp

注意顺序。 首先分配最左边的目标。 (C 中的类似表达式 可能会相反的顺序 分配。)来自 Python 分配 的文档:

…将单个结果对象从左到右分配给每个目标列表。

反汇编显示:

 >>> def chained_assignment():
...     x = y = some_function()
...
>>> import dis
>>> dis.dis(chained_assignment)
  2           0 LOAD_GLOBAL              0 (some_function)
              3 CALL_FUNCTION            0
              6 DUP_TOP
              7 STORE_FAST               0 (x)
             10 STORE_FAST               1 (y)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE


注意: 相同的对象 总是分配给每个目标。所以正如@Wilduck 和@andronikus 指出的那样,你可能永远不想这样:

 x = y = []   # Wrong.

在上面的例子中,x 和 y 指的是同一个列表。因为列表是 可变 的,附加到 x 似乎会影响 y。

 x = []   # Right.
y = []

现在您有两个名称,分别指向两个不同的空列表。

原文由 Bob Stein 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题