我不知道为什么通过创建两个不同的实例我得到相同的结果?我的逻辑出了什么问题? (更新到工作)
基本上,这个班级应该在相应的年份中创建一个日期列表
代码本身:
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 :(得分:4)
您的makeDate
方法会修改全局date
。当你第一次打电话时,它会将2012年的所有366天添加到空列表中,然后给你第364个。当您第二次调用它时,在第二个实例上,它将2013年的所有365天添加到现有的366天列表中,然后为您提供第364个,与之前相同。
这正是您不想使用全局变量的原因。只需在self.date = []
方法中添加__init__
,然后使用self.date
代替date
,每个实例都有自己的列表。
或者您可以将其设为局部变量而不是全局变量,因此makeDate
只需在每次调用时创建并返回一个新列表。
答案 1 :(得分:1)
全局date
由Date
的所有实例共享,因此当您从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
的“全局变量”版本,并添加一个需要的本地或实例变量版本。