2014-11-22 28 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类型问题多次被咬。

相关问题