【问题标题】:Initializing empty Python data structures初始化空的 Python 数据结构
【发布时间】:2012-06-13 18:00:08
【问题描述】:

可用于创建空 Python 列表/字典的两种语法形式之间是否有任何明显的区别,即

l = list()
l = []

和:

d = dict()
d = {}

我想知道使用一个是否比另一个更可取。

【问题讨论】:

  • []{} 在我看来更快,更好看。

标签: python list dictionary


【解决方案1】:

函数形式在运行时调用构造函数以返回一个新实例,而文字形式使编译器在编译时“创建”它(实际上,发出产生新对象的字节码)。如果(出于某种原因)类已在本地反弹为不同类型,则前者可能很有用。

>>> def f():
...   []
...   list()
...   {}
...   dict()
... 
>>> dis.dis(f)
  2           0 BUILD_LIST               0
              3 POP_TOP             

  3           4 LOAD_GLOBAL              0 (list)
              7 CALL_FUNCTION            0
             10 POP_TOP             

  4          11 BUILD_MAP                0
             14 POP_TOP             

  5          15 LOAD_GLOBAL              1 (dict)
             18 CALL_FUNCTION            0
             21 POP_TOP             
             22 LOAD_CONST               0 (None)
             25 RETURN_VALUE        

【讨论】:

  • 这样做的一个有趣的副作用是,如果您正在编写一个需要在调用之间缓存一些数据的小函数(可能是一个简单的 memoizer),您可以说 def f(a, b, cache={}): 并且创建的 dict 将实际上在对f()的调用之间持续存在
  • @Robru:这无关。使用def f(a, b, cache=dict()) 也可以。
  • FWIW,对于非空实例,函数形式可能更灵活,因为它可以支持多种指定对象内容的方式,例如dict
【解决方案2】:

主要区别在于一种形式包含名称查找,而另一种则不包含。说明这种差异的示例:

def list():
    return {}

print []
print list()

打印

[]
{}

当然,你绝对不应该做这种废话。

【讨论】:

    【解决方案3】:

    我的直觉告诉我,只要你保持一致,两者都是可以接受的。

    【讨论】:

      【解决方案4】:

      我不知道有什么区别,主要是风格偏好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        • 1970-01-01
        相关资源
        最近更新 更多