在Python中重新分配列表的正确方法是什么?

时间:2014-10-07 10:28:33

标签: python 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 = 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)

更重要的是,这有关系吗?在第一个,是一个被释放的元素,是他们的引用计数0?或者程序仍然需要引用它。如果是这样,我完全覆盖了第二个例子中的引用。

2 个答案:

答案 0 :(得分:5)

两种方式都有效。它们之间有一个微妙的区别:

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

以下两个片段展示了不同之处:

# #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]

答案 1 :(得分:0)

根据我的问题,这似乎有所帮助 第一个问题: -

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。的索引中。