我正在重写一些代码,以便在我之前设计的程序中使用。我还在学习Python,所以请光临我。我尝试编写的一个函数是获取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
中包含的信息时,它只会返回[]
,空白列表。
我还定义了另一个函数来汇总每个条目的每个条目的人口信息。它需要使用上面函数中获得的头,并定义如下:
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')
调用最外层函数,然后使用一些print语句来评估代码是否正在执行它应该执行的操作,通过传递从一个函数获得的信息到另一个函数 - 它们不是。任何人都知道为什么会这样?
答案 0 :(得分:1)
你正在努力解决python如何处理引用 - 赋值运算符从右边的表达式中获取对象,并将其绑定到左边的本地名称(“覆盖”任何提前引用的名称) 。所以,像这样的函数:
a = []
def foo(lst):
lst = [1]
foo(a)
print a #[]
永远不会更新a
。相反,在函数内部,您可以在赋值的右侧创建一个新列表,并将其绑定到参数左侧的 local 名称。
这与预期基本相同:
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.
答案 1 :(得分: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')
确保您了解函数的工作原理,以及传值和传递引用之间的区别。