2012-03-09 65 views
2

这里是我的代码:为什么这个python代码不会替换已删除的列表元素?

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每个元素,正如所预期的。但是temp_list在每次初始for循环运行时都没有被重置,并将其设置回source_list。因此,每次从temp_list中删除都是永久的,持续for循环的每一次迭代。我怎样才能避免这种情况,并每次temp_list“重置”回到其初始状态?

回答

3

声明temp_list = source_list不会创建新列表。它给一个现有的列表一个新的名字temp_list。不管你用什么名字来访问列表—通过一个名字进行的任何改变都可以通过另一个名字看到。

相反,你需要复制该列表,像这样:

temp_list = source_list[:] 

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

1

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

temp_list = source_list[:] 
2
>>> a = [ 1 ] 
>>> b = a 
>>> del a[0] 
>>> print b 
[] 

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

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] 

这应该按预期工作。 :)

相关问题