初学者很困惑为什么即使列表[var1,var2]发生变化,var1也不会改变

时间:2013-03-07 14:05:55

标签: python

非常棒的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)

以年份[]更改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

您的帖子看起来代码太多了,这里再添加一些文字了。文字很重要。

2 个答案:

答案 0 :(得分:0)

年份是一个列表,如果它是一个可变对象(即一个字典,列表等),则内部值通过引用复制,如果变量不可变(int,string,tuple等),则按值复制。因此,当您修改列表中的int值时,它不会反映用于构建它的int变量。

答案 1 :(得分:0)

创建列表年份时,变量year1和year2将按值传递。因此,当您在以下位置修改它时:

years[i] = year * 365

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

这个SO问题提供了有关如何在Python中传递参数的良好信息:How do I pass a variable by reference?

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