【问题标题】:Is *args in Python3 guaranteed to preserve order?Python3 中的 *args 是否保证保持顺序?
【发布时间】:2018-12-28 08:35:46
【问题描述】:

在 Python3 中,我可以使用 * 接受任意数量的位置参数。

一个示例:

def a(*args):
    for argument in args:
        print(argument)
a(1,2,3,4)

将因此打印:

1
2
3
4

我不确定的是,如果存储在args 中的位置参数的顺序实际上可以保证被保留?

我可以相信,如果我调用a(1,2,3,4),那么args总是 (1,2,3,4) 或者这只是实现细节的副作用?


在尝试调查此问题时,我看到**kwargs 中的顺序自Python 3.6 以来一直保留,这在PEP-468 中指定,但在这方面我没有找到任何提及*args

【问题讨论】:

  • 是的,它保留了顺序。
  • 当然,它可以按您的预期工作。
  • 这是否记录在某处?我在调查时找不到任何关于它的内容,但可能是我只是不知道在哪里看
  • docs.python.org/3/tutorial/…,这些参数将被包裹在一个元组中,并且元组保持顺序。

标签: python python-3.x function-signature positional-parameter


【解决方案1】:

当然,它会保留 Order,因为 *args 将参数视为元组数据类型。

在 Python 中,元组总是有其顺序。

只有字典是一种数据类型,不会遵循python中的顺序

【讨论】:

  • 甚至 dicts 也可以使用 Python 3.6/3.7+
  • 虽然 **kwargs 的顺序在 PEP-468 中记录和指定,但 *args 仅被提及被包装到一个元组中。虽然我知道 tuple 将保持其顺序,但我担心它是否指定了在形成所述元组时,它是为了保留未定义位置参数的顺序而完成的。我不太熟悉python如何将函数的给定参数映射到该元组中,因此问题更具体地说是是否指定结果元组按插入参数的顺序形成。或者恰好是由于它在 CPython 中实现的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2021-10-04
相关资源
最近更新 更多