Python - 使用封装/函数修改变量并将其传递给当前命名空间

时间:2013-04-04 19:55:36

标签: python encapsulation

我正在重写一些代码,以便在我之前设计的程序中使用。我还在学习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语句来评估代码是否正在执行它应该执行的操作,通过传递从一个函数获得的信息到另一个函数 - 它们不是。任何人都知道为什么会这样?

2 个答案:

答案 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')

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