2015-10-09 46 views
-1

obj=lists[0]在下面的代碼中做了什麼?混淆變量的必要性

lists = [] 
infile = open(path, 'rb') 
while True: 
    try: 
     lists.append(pickle.load(infile)) 
    except EOFError: 
     break 
obj=lists[0] 
while len(lists) > 3: 
    lists.pop(0) 
print(lists) 
infile.close() 

我試圖理解它,但我似乎無法看到任何理由。

+2

對於你所說的代碼,它似乎沒有任何用途。 –

+0

可能從一些重構遺留下來。 –

回答

3

沒什麼。

obj在其初始分配後從未被引用,因此它對任何內容都沒有影響。

我可以看到該行做任何事情的唯一可能方式是,如果lists是一些奇怪的類,其__getitem__調用有副作用。例如,

class StrangeList(list): 
    def __getitem__(self, idx): 
     self[idx] = 23 
     return 23 

def a(): 
    x = StrangeList([1,2,3]) 
    print x 

def b(): 
    x = StrangeList([1,2,3]) 
    obj = x[0] 
    print x 

print "Calling a" 
a() 
print "Calling b" 
b() 

結果

Calling a 
[1, 2, 3] 
Calling b 
[23, 2, 3] 

這裏,做obj = x[0]確實做一些事情,即使是從未使用過obj。但這是一個人爲的例子;對於您當前的代碼以及將來可能使用的類中的99.9%,__getitem__不會以這種方式表現。

1

假設這是所有的代碼,這是沒有用的,正如@丹尼爾羅斯曼提到的,它必須是一些重構的遺留。

如果程序中有更多的代碼,我建議使用變量obj來保存列表的第一個值。它下面的循環消耗列表中的所有元素(除了最後三個元素),所以如果您需要列表中的原始第一個對象,則需要保留它 - 因此,obj歸因。