【问题标题】:What is the correct way to reassign a list in Python?在 Python 中重新分配列表的正确方法是什么?
【发布时间】:2014-12-01 18:11:16
【问题描述】:

我应该;

a = range(100)
old_list = filter(lambda x: x not in a, old_list)
a = range(200)
old_list = filter(lambda x: x not in a, old_list)

或:

a = range(100)
old_list = filter(lambda x: x not in a, old_list)
a[:] = range(200)
old_list = filter(lambda x: x not in a, old_list)

更重要的是,这重要吗?首先,a 中的元素是否已释放,它们的引用计数是否为 0?或者程序是否仍然需要对它的引用。如果是这样,我将完全覆盖第二个示例中的引用。

【问题讨论】:

  • 如果 old_list 未定义,“old_list = filter(lambda x: x not in a, old_list)”将如何工作?
  • a[:] = range(200) 更改绑定到 a 的同一列表的内容(假设 Python 2 其中range 返回一个列表),但 not 将 a 重新绑定到一个新的列表/对象。如果这个“重要”取决于其他使用a(更重要的是,之前绑定的对象)以及预期的行为。 (没有其他要求,我使用第一种形式,避免意外的副作用。)
  • 我想补充一下,我真的不知道你想做什么,你能提供一个输入/输出的例子吗? (将 100 替换为 3 和 200 替换为 6)
  • 是的,它是 Python 2。假设 old_list 已定义。这是一个在下面完美回答的重新分配问题。

标签: python list


【解决方案1】:

两种方式都有效。它们之间有细微的差别:

  • 第一个创建一个全新的列表对象a。
  • 第二个替换现有列表对象a中的所有元素。

下面两个sn-ps演示了区别:

# #1
a = range(3)
b = a
a = range(5)
print b

# #2
a = range(3)
b = a
a[:] = range(5)
print b

第一个打印出来

[0, 1, 2]

而第二个打印出来

[0, 1, 2, 3, 4]

【讨论】:

    【解决方案2】:

    根据我收到您的问题,这似乎有帮助 对于第一个问题:-

    old_list = tuple(range(110))
    a = range(100)
    old_list = filter(lambda x: x not in a, old_list)
    print id(a)
    a = range(200)
    old_list = filter(lambda x: x not in a, old_list)
    print id(a)
    

    输出是:-

    140412939507040
    140412939380568
    

    第二个问题:-

    a = range(100)
    old_list = filter(lambda x: x not in a, old_list)
    print id(a)
    a[:] = range(200)
    old_list = filter(lambda x: x not in a, old_list)
    print id(a)
    

    输出是:-

    140295816890632
    140295816890632
    

    第一次id 被释放,但第二次保持不变。 在第二个问题中,您只是将数据处理到 a 的索引中。

    【讨论】:

    • 那么什么是最快的,将数据复制到索引中(如(2)),或创建新列表(如(1))?
    • 在这个阶段甚至不要考虑“什么是最快的”。两者都是合理的,因此是合理有效的方法。任何性能差异(如果存在)都不是重点。
    • @Martol1ni :对于这种情况,(1) 是最干净的代码。实际速度差异很小,并且取决于实现细节。我想你会喜欢阅读 SO 成员 Ned Batchelder 的 Facts and myths about Python names and values。
    猜你喜欢
    • 2021-12-07
    • 2017-08-03
    • 2012-03-18
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多