如何在少数类上使用一个List而不影响该列表

时间:2014-11-22 16:08:57

标签: python algorithm list

我正在比较一些算法。每个算法(类)都收到相同的列表。问题是第一类影响列表,其他类不能在该列表上工作。 有没有聪明的方法来做到这一点?

这是一段代码:

Lista = []
start = 54
for i in range(25):
   liczba = random.randint(1,179)
   if liczba not in Lista and liczba != start:
      Lista.append(liczba)
   else:
      i -= 1

print "Lista: ", Lista


x = SSTF(Lista)
x.Symulacja(91)  #<----- OK!

y = FCFS(Lista)
y.Symulacja(25) #<----- FCFS received epty list.

z = SCAN()
z.Symulacja(start, Lista)

w = C_SCAN()
w.Symulacja(start, Lista)


results = Result()
results.Add(x) 
results.Add(y) 

print Results        

SSTF正在从接收到的列表中删除元素,FCFS也是如此。所以经过SSTF算法后,FCFS显示空列表。我无法理解为什么这个列表会受到影响。我没有在列表“Lista”上工作,但在SSTF的 init 中,我将“Lista”分配给其他列表。

很抱歉,如果我的问题不明确。我正在学习python,这个问题多次袭击我。

1 个答案:

答案 0 :(得分:1)

x = SSTF(Lista[:])
y = FCFS(Lista[:])
....

等...

你的问题:

def SSTF(Lista):
    Listb = Lista

表示Listb仍然是相同的Lista,因为这是对同一对象的引用。

为避免这种情况,请使用[:]切片表示法完全复制列表(Python词典具有.copy()方法,这更清晰)。

基本上,每次将对象的引用从一个变量复制到另一个变量时,最终会有两个指向同一对象的指针,因此两个变量名都会看到对该对象的更改。是的,对术语感到抱歉。

指针由下面的id()代码显示。请注意li == li2!= li3

>>>li = [1,2]
>>>li2 = li
>>>li3 = li[:]
>>>li2.append(3)
>>>print "li:", id(li), li
>>>print "li2:", id(li2), li2
>>>print "li3:", id(li3), li3

li: 4385880760 [1, 2, 3]
li2: 4385880760 [1, 2, 3]
li3: 4385924376 [1, 2]

数字或字符串之类的情况并非如此。查看“不可变”的概念。

  >>> a = "xxx"
  >>> b = a
  >>> b = b +"y"
  >>> print a, b
  xxx xxxy

  >>> a = 1
  >>> b = a
  >>> b =b+1
  >>> print a, b
  1 2

如果需要复制自定义类的实例,请查看复制模块,但请记住,实例属性是共享的或复制的,具体取决于使用copy.copy(x)或copy.deepcopy(x)。在实践中,这很少是必要的,但在我吸取教训之前,我已经多次被内置集合类的Lista类型问题所困扰。