Python: 全局变量的正确用法

2024-04-24 22:24:24 发布

您现在位置:Python中文网/ 问答频道 /正文

这是密码!在

import csv

def do_work():
      global data
      global b
      get_file()
      samples_subset1()
      return

def get_file():

      start_file='thefile.csv'

      with open(start_file, 'rb') as f:
        data = list(csv.reader(f))
        import collections
        counter = collections.defaultdict(int)

      for row in data:
        counter[row[10]] += 1
      return

def samples_subset1():

      with open('/pythonwork/samples_subset1.csv', 'wb') as outfile:
          writer = csv.writer(outfile)
          sample_cutoff=5000
          b_counter=0
          global b
          b=[]
          for row in data:
              if counter[row[10]] >= sample_cutoff:
                 global b
                 b.append(row) 
                 writer.writerow(row)
                 #print b[b_counter]
                 b_counter+=1
      return

我是python的初学者。我的代码运行方式是调用do\u-work,而do\u-work将调用其他函数。以下是我的问题:

  1. 如果我需要data只被2个函数看到,我应该使它全局化吗?如果不是,那么我应该如何调用samples_subset1?我应该从get_file调用它还是从do_work调用它?

  2. 这段代码很好用,但是你能指出它的编写方式有哪些好的/坏的地方吗?

  3. 我正在处理一个csv文件,有多个步骤。我将这些步骤分解成不同的函数,比如get_filesamples_subset1,我还将添加更多的功能。我应该继续这样做吗,我现在在这里调用do_work中的每个单独的函数?

以下是新代码,根据以下答案之一:

^{pr2}$

Tags: csv函数datagetreturndefcounterglobal
3条回答

根据经验,避免全局变量。在

这里很简单: 让get_file返回数据 然后你可以说

data = get_file()
samples_subset1(data)

另外,我会在文件顶部执行所有导入操作

如果您必须使用一个全局(有时我们必须这样做),您可以用python方法定义它,并且只允许某些模块访问它,而不必在所有函数/类的顶部使用讨厌的global关键字。在

创建一个只包含全局数据的新模块(在您的例子中,假设csvGlobals.py):

# create an instance of some data you want to share across modules
data=[]

然后,您要访问这些数据的每个文件都可以这样做:

^{pr2}$

如果要在两个或多个函数之间共享数据,通常最好使用一个类,并将函数转换为方法,将全局变量转换为类实例上的属性。在

顺便说一句,您不需要在每个函数的末尾都使用return语句。只有当您想返回值或在函数中间返回时,才需要显式返回。在

相关问题 更多 >