这是我的代码:
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"每次都回到初始状态?
答案 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]
这应该按预期工作。 :)