1

对 python 和整体编程非常陌生。为什么这段代码:

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    years = [year1, year2]
    def leapyr(n):
        if n % 400 == 0:
            return True
        elif n % 100 == 0:
            return False
        elif n % 4 == 0:
            return True
        else:
            return False

    for i, year in enumerate(years):
        if leapyr(year):
            years[i] = year * 366
            print 'l:', years, year1, year2
        else:
            years[i] = year * 365
            print 'n:', years, year1, year2

daysBetweenDates(1,1,1,4,2,1)

在years[ ]中改变year1和year2,但不改变year1和year2?

n: [365, 4] 1 4
l: [365, 1464] 1 4

编辑:工作代码

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    years = [year1, year2]
    def leapyr(n):
        if n % 400 == 0:
            return True
        elif n % 100 == 0:
            return False
        elif n % 4 == 0:
            return True
        else:
            return False

    for i, year in enumerate(years):
        if leapyr(year):
            years[i] = year * 366
            year1 = years[0]
            year2 = years[1]
            print 'l:', years, year1, year2
        else:
            years[i] = year * 365
            year1 = years[0]
            year2 = years[1]
            print 'n:', years, year1, year2

daysBetweenDates(1,1,1,400,2,1)

现在给出正确答案:

n: [365, 400] 365 400
l: [365, 146400] 365 146400

你的帖子看起来代码太多了,这里放一些更多的文字。文字很重要。

4

2 回答 2

0

Years 是一个列表,如果它是可变对象(即 dict、list 等),则通过引用复制其中的值,如果变量不可变(int、string、tuple 等),则通过值复制。因此,当您修改列表中的 int 值时,它不会反映用于构建它的 int 变量。

于 2013-03-07T14:12:49.880 回答
0

当您创建列表年份时,变量 year1 和 year2 将按值传递。因此,当您随后修改它时:

years[i] = year * 365

您只是更改列表中的值,而不是创建它的变量。

这个 SO 问题有关于如何在 Python 中传递参数的很好的信息:如何通过引用传递变量?

从我的浏览来看,您可能需要将日期作为对象而不是原始整数传递给您的 daysBetweenDates 函数。

于 2013-03-07T14:22:44.677 回答