两个不同的实例给出相同的结果(Python)

时间:2013-11-25 22:39:26

标签: python

我不知道为什么通过创建两个不同的实例我得到相同的结果?我的逻辑出了什么问题? (更新到工作)

基本上,这个班级应该在相应的年份中创建一个日期列表

代码本身:

class Date:

    def __init__(self, year):
        self.year = year

    def dateStr(self, date):
        if date < 10:
            date = '0' + str(date)
        else:
            date = str(date)
        return date

    def daysInMonth(self, month):
        if month == 4 or month == 6 or month == 9 or month == 11:
            endDate = 30
        if month == 1 or month == 3 or month ==5 or month == 7 or month ==8 or month == 10 or month == 12:
            endDate = 31
        if self.year%4 == 0 and month == 2:
            endDate = 29
        if self.year%4 != 0 and month == 2:
            endDate = 28
        return endDate

    def makeDate(self):
        self.date = []
        month = 1
        while month <= 12:
            day = 1
            while day <= self.daysInMonth(month):
                    self.date.append(str(self.dateStr(day)) + u'.' + str(self.dateStr(month)) + u'.' + str(self.year))
                day += 1
            month += 1
        return self.date

    def __str__(self):
        return str(self.makeDate())

    def __len__(self):
        return len(self.makeDate())

    def __getitem__(self, key):
        return self.makeDate()[key]

date1 = Date(2012)
date2 = Date(2013)
print date1[364]
print date2[364]

感谢您的支持,
亚历

4 个答案:

答案 0 :(得分:4)

您的makeDate方法会修改全局date。当你第一次打电话时,它会将2012年的所有366天添加到空列表中,然后给你第364个。当您第二次调用它时,在第二个实例上,它将2013年的所有365天添加到现有的366天列表中,然后为您提供第364个,与之前相同。

这正是您不想使用全局变量的原因。只需在self.date = []方法中添加__init__,然后使用self.date代替date,每个实例都有自己的列表。

或者您可以将其设为局部变量而不是全局变量,因此makeDate只需在每次调用时创建并返回一个新列表。

答案 1 :(得分:1)

全局dateDate的所有实例共享,因此当您从date返回Date.makeDate时,您将返回对该列表的引用。 date2[364]返回date1[364]所做的相同元素。在调用Date.__getitem(date2, 364)之后,您应该注意到date在列表中有超过700个项目。虽然date1[364]date[364]相同,但date2[364]实际上类似于date[728]。您需要在每次调用date时重置makeDate的值,或者(更好),丢弃全局变量并使用makeDate内的本地列表,初始化为{{1每一次。

答案 2 :(得分:0)

您要附加到全局date变量。因为它已经被第一次调用修改了,所以第二次调用什么都没做,只是返回它。

date应该是什么?我想你可能意味着它是一个局部变量

def makeDate(self):
    date = []           # brand new empty list
    month = 1
    while month <= 12:
        day = 1
        while day <= self.daysInMonth(month):
            if (self.year%4 == 0 and len(date) < 366) or (self.year%4 != 0 and len(date) < 365):
                date.append(str(self.dateStr(day)) + u'.' + str(self.dateStr(month)) + u'.' + str(self.year))
            day += 1
        month += 1
    return date

答案 3 :(得分:0)

变量date绑定到您在类Date之外创建的列表。

然后,在各种类函数中,您操纵变量date,它引用外部实体列表。这会向列表添加各种值(同样,它与任何特定的类实例无关),然后返回列表。

就像在做:

x = 3
def f(incr):
    global x
    x += incr
    return x

然后想知道为什么,在incr(1)返回4之后,第二个incr(1)返回5.这是因为你正在修改一个“全局变量”。

我并不完全清楚你想要这一切是如何工作的,但显而易见的第一步是摆脱date的“全局变量”版本,并添加一个需要的本地或实例变量版本。