列表变量在更新之间更新

时间:2012-08-27 18:53:44

标签: python

我对名为intervals的函数有以下定义。 从底部的打印声明我得到这个结果(这是半小时的时间间隔,如9:00,9:30等,表示为列表中的列表,我相信)。

[[9,0],[10,30],[10,30],[10,30]]

我想要以下结果。

[[9,0],[9,30],[10,0],[10,30]]

运行的完整日志如下。请注意,列表list仅在whileprint "b(efore)"语句之间的print "a(fter)"循环中更新一次,但在list后更改after在下一个before之前。怎么会发生这种情况?

[9, 30] [[9, 0]] b
[9, 30] [[9, 0], [9, 30]] a
[10, 0] [[9, 0], [10, 0]] b
[10, 0] [[9, 0], [10, 0], [10, 0]] a
[10, 30] [[9, 0], [10, 30], [10, 30]] b
[10, 30] [[9, 0], [10, 30], [10, 30], [10, 30]] a
[[9, 0], [10, 30], [10, 30], [10, 30]]

def intervals(start,end):
    if start>=end:
        return []
    else:
        if 0<=start[1]<30:
            start[1]=0
        else:
            start[1]=30
        list = []
        list.append(start)
        last = start
        new=[0,0]
        while end>last:
            if 30==last[1]:
                new[0]=1+last[0]
                new[1]=0
            else:
                new[0]=last[0]
                new[1]=30
            last=new
            print new,list,"b"
            list.append(new)
            print new,list,"a"
        return list

print intervals([9,0],[10,30])

任何人都可以解决它吗?

2 个答案:

答案 0 :(得分:1)

您看到这一点的原因是,在while循环的每次迭代中,您将列表new附加到列表list的末尾(您应该重命名,因为它掩盖内置列表类型。)

只需移动new=[0,0]行,使其成为while循环中的第一行,这将在每次迭代时创建一个新列表,这样您的最终列表就不会有多个引用同样的清单:

        ...
        while end>last:
            new=[0,0]
            ...

请注意,如果您计划为此添加更多复杂性(例如,不同的时间间隔超过30分钟),我建议使用datetime moduledatetime.timedelta(minutes=30)可能会有用,例如:

from datetime import datetime, timedelta

def intervals(start, end):
    temp = datetime.min + timedelta(hours=start[0], minutes=start[1])
    last = datetime.min + timedelta(hours=end[0], minutes=end[1])
    interval = timedelta(minutes=30)
    result = []
    while temp <= last:
        result.append([temp.hour, temp.minute])
        temp += interval
    return result

>>> intervals([9, 30], [12, 30])
[[9, 30], [10, 0], [10, 30], [11, 0], [11, 30], [12, 0], [12, 30]]
>>> intervals([9, 45], [12, 15])
[[9, 45], [10, 15], [10, 45], [11, 15], [11, 45], [12, 15]]

答案 1 :(得分:0)

使用while-else循环:

start_hour=9
start_min=30
lis=[[start_hour,start_min]] #simple initialize
stop_hour=12
stop_min=30

while lis[-1][0]!=stop_hour:
    if lis[-1][1]==30:
        lis.append([lis[-1][0]+1,0])
    else:
        lis.append([lis[-1][0],30])
else:
    if lis[-1][1]!=stop_min:
        lis.append([lis[-1][0],stop_min])


print lis        

<强>输出:

[[9, 30], [10, 0], [10, 30], [11, 0], [11, 30], [12, 0], [12, 30]]