我正在比较一些算法。每个算法(类)都收到相同的列表。问题是第一类影响列表,其他类不能在该列表上工作。 有没有聪明的方法来做到这一点?
这是一段代码:
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,这个问题多次袭击我。
答案 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类型问题所困扰。