2014-11-22 31 views
0

我比較幾個算法。每個算法(類)收到相同的列表。問題在於,對列表和其他類的第一類影響無法在該列表上工作。 有沒有什麼聰明的方法來做到這一點?如何使用一個列表上的幾個類沒有影響的列表

下面是一個代碼:

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」上工作,但在init的SSTF中,我將「Lista」分配給其他列表。

對不起,如果我的問題不明確。我正在學python,這個問題多次打到我。

+0

如果你擁有可卡因(我相信類)使他們純潔。如果沒有,使用不可變的,用元組替換你的列表? – Meitham 2014-11-22 16:11:14

+0

我沒有自己的可調參數(正如我剛纔所說的,我剛剛學習python;))。元組無法在這種情況下工作。名單上的操作太多了。對我來說奇怪的是,在Python中分配意味着引用。因此List = List2 = [1,2,3]意味着List2上的某些操作在List上執行相同操作。有什麼辦法可以避免它? – 2014-11-22 16:30:03

+0

用一個副本調用函數:'x = SSTF(Lista [:])'。 – Daniel 2014-11-22 16:33:26

回答

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

等等

您的問題:

def SSTF(Lista): 
    Listb = Lista 

意味着數組listB還是一樣利斯塔,因爲這是同一個對象的引用。

爲了避免它,使用[:]切片符號(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類型問題多次被咬。

相關問題