2013-11-25 156 views
1

我不知道为什么通过创建两个不同的实例我得到相同的结果?我的逻辑有什么问题? (更新工作)两个不同的实例给出相同的结果(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] 

感谢支持,
亚历

+0

你会得到什么结果? –

+3

'len(date)<366)'看起来不正确。您可能必须在'makeDate()''date''中使用'全球日期' – karthikr

+0

2012年的两个日期列表,而我预计2012年会有一个日期,2013年会有另一个。 – Alekz112

回答

4

makeDate方法修改全局date。当你第一次打电话给它时,它将2012年的所有366天添加到空列表中,然后给你第364天。当你第二次打电话给它时,它将在2013年的所有365天中增加366天的现有清单,然后给你第364天,这与以前一样。

这正是您不想使用全局变量的原因。只需在__init__方法中输入self.date = [],并使用self.date而不是date,并且每个实例都有自己的列表。

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

+0

拍摄,现在我看到了逻辑。万分感谢!但如何正确地改变它?我的意思是,如何正确地在__init__函数中放置self.date? – Alekz112

+0

@ user2619492:我在第二段中解释过:“只需在'__init__'方法中放入'self.date = []'。”你不明白什么? – abarnert

+0

虽然 – Alekz112

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 
1

全球date是由Date所有实例共享,所以当你从Date.makeDate返回date,您返回到列表的引用。 date2[364]返回的是与​​相同的元素。在致电Date.__getitem(date2, 364)后,您应该注意到date在列表中有700多个项目。虽然​​和date[364]将是相同的,date2[364]是真的像date[728]。您需要在每次调用makeDate或更好的时候重置date的值,然后排除全局变量并使用makeDate内的本地列表,每次初始化为[]

0

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

然后,在各种类别功能中,您可以操作变量date,它指的是外部实体列表。这会向列表中添加各种值(同样,它不会与任何特定的类实例关联),然后返回列表。

这就像做:

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

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

这不是完全清楚你来我想怎么这一切工作,但很明显,第一步就是要摆脱的date的“全局变量”的版本,并添加本地或实例变量的版本需要的地方。

相关问题