对可变必然性的困惑

2024-05-03 04:08:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码中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()

我试图理解它,但我似乎看不出任何理由


Tags: path代码trueobjloadopenpickleinfile
2条回答

什么都没有

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__不会这样做

假设这就是所有的代码,那么它就没有任何用处了,正如@danielroseman所提到的,它一定是一些重构的遗留问题

如果程序中有更多代码,我建议使用变量obj来保留列表的第一个值。它下面的循环使用列表中的所有元素(除了最后三个),因此如果您需要列表中的第一个原始对象,您需要保留它—因此,obj属性

相关问题 更多 >