为什么这个python代码不能替换已删除的列表元素?

时间:2012-03-09 05:08:17

标签: python list

这是我的代码:

for each in range(0, number_of_trials):
  temp_list = source_list
  for i in range(10):
    x = random.randrange(0, len(temp_list))
    board[i] = temp_list[x]
    del temp_list[x]

此代码正在删除temp_list中的每个元素,如预期的那样。但是每次初始for循环运行时都不会重置temp_list,将其设置回source_list。因此,每次从temp_list删除都是永久性的,对于for循环的每次后续迭代都是持久的。我怎样才能避免这种情况并让temp_list" reset"每次都回到初始状态?

4 个答案:

答案 0 :(得分:3)

语句temp_list = source_list不会创建新列表。它为现有列表指定了新名称temp_list。用于访问列表的名称无关紧要 - 通过一个名称进行的任何更改都将通过另一个名称显示。

相反,您需要复制列表,如下所示:

temp_list = source_list[:]

这将创建一个以source_list相同内容开头的新列表。现在,您可以更改新列表而不会影响原始列表。

答案 1 :(得分:2)

>>> a = [ 1 ]
>>> b = a
>>> del a[0]
>>> print b
[]

基本上,当你使用“=”时,两个变量都指向同一个对象。要制作副本,请使用copy模块。

答案 2 :(得分:1)

复制列表元素而不是列表引用。

temp_list = source_list[:]

答案 3 :(得分:0)

这是因为:

temp_list = source_list # Doesn't copies the list, but adds the reference.

所以,每次迭代都只刷新引用。

要复制列表,您可以使用技巧[:]。这将执行没有任何切片的列表切片,并生成与正在切片的列表完全相同的新列表。

因此,

for each in range(0, number_of_trials):
  temp_list = source_list[:]                # Changed
  for i in range(10):
    x = random.randrange(0, len(temp_list))
    board[i] = temp_list[x]
    del temp_list[x]

这应该按预期工作。 :)