Python3如何声明“的全局变量”;至于;环

Python3如何声明“的全局变量”;至于;环,python,python-3.x,global-variables,Python,Python 3.x,Global Variables,所以我尝试在For循环中使用全局变量。当不在函数“def”中时,此代码可以正常工作,但我需要它,因为我正在尝试创建一个tkinter文件对话框,该对话框在选择文件后运行代码,如果您可以帮助告诉我我做错了什么,或者为我提供使用tkinter和“def”的替代方法 工作代码: import os import sqlite3 from datetime import datetime # import datetime import itertools from dateutil.relatived

所以我尝试在For循环中使用全局变量。当不在函数“def”中时,此代码可以正常工作,但我需要它,因为我正在尝试创建一个tkinter文件对话框,该对话框在选择文件后运行代码,如果您可以帮助告诉我我做错了什么,或者为我提供使用tkinter和“def”的替代方法

工作代码:

import os
import sqlite3
from datetime import datetime
# import datetime
import itertools
from dateutil.relativedelta import relativedelta
date = datetime.strptime('1991-01-01', '%Y-%m-%d')
f_path = 'C:/Users/Lewis Collins/Job_Code/data/cru_ts_2_10.1991-2000_cutdown.pre'

# db = sqlite3.connect('output.db')
# cursor = db.cursor()
# cursor.execute('CREATE TABLE Rainfall (Xref, Yref, Date, Value)')
# date = datetime.date(1991,1,1)

flag = 0

Xref = ''

Yref = ''

with open(f_path) as file_read:

    for row in itertools.islice(file_read, 5, None):
        # print(row)
        if 'Grid-ref' in row:
            Xref = row.split(',')[0].split('=   ')[1]
            Yref = row.split(',')[1]
            date = datetime.strptime('1990-12-01', '%Y-%m-%d')
        else:
            for Value in row.split():
                date = date + relativedelta(months=+1)
                # print(Xref.strip(), Yref.strip(), date, Value)

                # print(Xref, Yref, date, Value)

# db.commit()
# db.close()
编辑代码:

import tkinter
from datetime import datetime
from dateutil.relativedelta import relativedelta
import itertools

#date = datetime.strptime('1991-01-01', '%y-%m-%d')

# date = datetime.strptime('1991-01-01', '%Y-%m-%d')
f_path = 'C:/Users/Lewis Collins/Job_Code/data/cru_ts_2_10.1991-2000_cutdown.pre'
Xref = ''
Yref = ''



def read_date():

    with open(f_path) as file_read:

        for row in itertools.islice(file_read, 5, None):

            if 'Grid-ref' in row:
                Xref = row.split(',')[0].split('=   ')[1]
                Yref = row.split(',')[1]
                date = datetime.strptime('1990-12-01', '%y-%m-%d')
            else:
                for Value in row.split():
                    date = date + relativedelta(months=+1)
                    print(Xref.strip(), Yref.strip(), date, Value)
不建议使用全局变量的PS,仅当它是您的最后一种方式时才使用它们

像这样在函数中添加全局关键字

my_blobal_var
my_blobal_var2

def my_func():
    global my_blobal_var
    global my_blobal_var2
    do_something()
为了你的案子

Xref = ''
Yref = ''

def read_date():
      global Xref
      global Yref
      do_your_thing()

不要使用全局变量。这几乎总是一个错误。将参数传递给函数并使其返回结果:

def read_date(path):
    xref = ''
    yref = ''
    with open(path) as file_read:
        for row in itertools.islice(file_read, 5, None):
            if 'Grid-ref' in row:
                xref = row.split(',')[0].split('=   ')[1]
                yref = row.split(',')[1]
                date = datetime.strptime('1990-12-01', '%y-%m-%d')
            else:
                for Value in row.split():
                    date = date + relativedelta(months=+1)
                    print(Xref.strip(), Yref.strip(), date, Value)
    return xref, yref, date, Value
这样,
xref
yref
,…就是
read\u date
函数中的局部变量。完成后,它会将它们的值返回给调用方。它还将文件路径作为参数,而不是绑定到全局变量。你可以这样称呼它:

Xref, Yref, date, Value = read_date(f_path)

注意:代码示例中的实际有用数据不清楚。只要返回您关心的任何结果,并在调用函数时以相同的顺序收集它们。

当我这样做时,我会收到一个新的错误,我不会像我之前所说的那样,再次收到新的错误。代码与原始代码几乎相同。我将随错误一起添加更改。或者,很抱歉,这将违反问题已被回答我不知道这是否违反规定,但如果问题已解决,请将其标记为已解决:)不要使用全局变量。让函数
返回结果。我需要
Xref Yref date Value
因为我的下一步是将它们以4列的形式添加到数据库中,代码的底部部分做了什么?请解释一下。谢天谢地。该调用显示如何从主程序调用函数。它将
f_path
作为打开路径,并将返回的值放入四个变量
Xref
Yref
date
Value
。(实际过程称为解包:将4元组值解包为4个变量。)