0

我正在尝试编写一个函数,该函数获取 CSV 文件的标题并将其存储为列表,稍后将很有用:

def getHeader(filename, headername):
     import csv
     charList = ['a', 'b', 'c', 'd', 'e', 'A', 'B', 'C', 'D', 'E', 'F'] <<<---a lot longer
     headercsv = open(filename, 'r', newline = '')
     headerreader = csv.reader(headercsv, delimiter = ',')
     for row in headerreader:
         if row[0][0] in charList:
              headername = row

     headercsv.close()
     return headername

然后我执行以下操作:

thisHeader = []
getHeader('csvfile.csv', thisHeader)

如果我在 shell 中尝试这个,它会返回正确的信息,但是当我尝试查看变量中包含的信息时thisHeader,它只返回[]一个空白列表。

我还定义了另一个函数来汇总每个队列的每个条目的人口信息。需要用到上面函数中得到的header,定义如下:

def newPopCount(filename, fileheader, popholder):
     import csv
     cohorts = []
     for i in range (3, len(fileheader)):
          cohorts.append(fileheader[i])
     for i in range (len(cohorts)):
          popholder.append(0)

     popcsv = open(filename, 'r', newline = '')
     popreader = csv.reader(popcsv, delimiter = ',')

     for row in popreader:
         counter = 0
         if row[0] == fileheader[0]:
             continue
         else:
             for i in range(3, len(fileheader)):
                 popholder[counter] += int(row[i])
                 counter += 1

     popcsv.close()
     return popholder

我在另一个函数中定义了这些函数,以便只调用带有文件名的最外层函数,test('csvfile.csv')然后使用一些打印语句来评估代码是否正在执行它应该做的事情,方法是将从一个函数获得的信息传递给其他功能 - 他们不是。

4

2 回答 2

1

您正在为 python 如何处理引用而苦苦挣扎——赋值运算符从右侧的表达式中获取对象,并将其绑定到左侧的本地名称(“覆盖”任何提前引用的名称)。所以,像这样的函数:

a = []
def foo(lst):
    lst = [1]

foo(a)
print a #[]

永远不会更新a。相反,在函数内部,您在赋值右侧创建一个新列表,并将其绑定到参数左侧的本地名称。

这与预期基本相同:

a = []
b = a
b = [1]
print a #[]

修改a(它不会)。

但是,您可以执行将改变函数中列表的操作:

def foo(lst):
    lst.append(1)

a = []
foo(a)
print a #[1]

在最后一种情况下,如果您总是希望输入一个空列表,那么编写如下内容更为惯用:

def foo():
    return [1]

a = foo()

当您可以直接返回填充列表并让调用者做任何他们想做的事情时,调用者不需要创建一个空列表只是为了将它传递给函数。(这是其他人在他们的答案中推荐的方法,我完全同意他们)。


请注意,在 python 中,一个函数通常会修改其参数以返回None以清楚地表明参数正在发生变化。你有时会看到类似的东西:

def foo(lst):
    a = [x*x for x in lst]
    return a

a = [1, 2, 3]
a = foo(a)  #Nothing wrong with this.
于 2013-04-04T20:00:50.347 回答
1

你不是把事情复杂化了吗?

def getHeader(filename):
     import csv
     headername = None
     charList = ['a', 'b', 'c', 'd', 'e', 'A', 'B', 'C', 'D', 'E', 'F']
     headercsv = open(filename, 'r', newline = '')
     headerreader = csv.reader(headercsv, delimiter = ',')
     for row in headerreader:
         if row[0][0] in charList:
              headername = row

     headercsv.close()
     return headername

现在你可以:

thisHeader = getHeader('csvfile.csv')

确保您了解函数的工作原理,以及按值传递和按引用传递之间的区别。

于 2013-04-04T20:01:07.577 回答