如何在if语句之外声明变量

时间:2018-05-29 12:16:08

标签: python

这是我的代码:

last_state={}
last_device={}
last_substate={}
with open("TESTFILE.csv") as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        device = row[0]
        state = row[1]
        model = row[2]
        substate=row[3]
        #time = row[4]
        if device in row:

            if substate == 'Not joined' and model !='electric_meter':
                if state == "Offline":
                    N_off = [device]
                   # print N_off, reader.line_num

                if state == 'Online':
                    N_on = [device]

                if N_off == N_on:
                    print device, reader.line_num

我正在尝试比较这两个循环的设备ID,以便我只使用符合所有条件的那些。我不知道为什么但是我收到了这个错误:

      `if N_off == N_on:
NameError: name 'N_off' is not defined`

我不熟悉Python以及声明变量如何工作,但我试图在全局声明它们,这给了我同样的错误。我理解这是因为我在其范围之外使用N_off,但我不确定如何纠正它。

4 个答案:

答案 0 :(得分:0)

假设您希望N_off是全局的,则需要import包含N_off全局声明的文件,并在此文件中将其用作filename.N_off 。在包含声明的文件中,您不需要在文件名前加上前缀。请注意,您(通常)不需要在python中声明变量。全局变量是一个例外。

示例:

<强> OtherFile

global N_off
N_off = value

<强> CurrentFile

import OtherFile
if OtherFile.N_off == N_on:

答案 1 :(得分:0)

看一下代码的这一部分:

if state == "Offline":
    N_off = [device]

if state == 'Online':
    N_on = [device]

if N_off == N_on:
    print device, reader.line_num

如您所见,N_off仅定义为if state == "Offline",而N_on仅定义为if state == 'Online'

因此,当您在上一个if语句中对它们进行比较时,Python只定义了其中一个,因此只知道其中一个。

您只需在程序中的某个位置初始化,以确保它们都已定义。

答案 2 :(得分:0)

您已在N_off语句中定义N_onif,只有一个或另一个可以为真并执行,请尝试以下方法:

last_state={}
last_device={}
last_substate={}
with open("TESTFILE.csv") as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        device = row[0]
        state = row[1]
        model = row[2]
        substate=row[3]
        #time = row[4]
        if device in row:

            if substate == 'Not joined' and model !='electric_meter':

                N_off = None
                N_on = None

                if state == "Offline":
                    N_off = [device]
                   # print N_off, reader.line_num

                if state == 'Online':
                    N_on = [device]

                if N_off == N_on:
                    print device, reader.line_num

但是我没有看到这里的逻辑:

if state == "Offline":
    N_off = [device]
    # print N_off, reader.line_num

if state == 'Online':
    N_on = [device]

if N_off == N_on:
    print device, reader.line_num

因为这个:

if N_off == N_on:
    print device, reader.line_num

永远不会执行,因为状态不能同时打开和关闭。

答案 3 :(得分:0)

假设您要遍历所有设备,并想要检查连续行是否具有与“离线”和“在线”相同设备的值。

你可以使用下面的代码,基本上在检查变量是否相等时,我添加了额外的条件来检查变量是否被初始化。如果他们没有初始化,我认为你的情况不会得到满足。

last_state={}
last_device={}
last_substate={}
#reader = [('device','Offline','model','Not joined')]
# Instead of file reading from list
reader = [('device','Offline','model','Not joined'),('device','Online','model','Not joined')]

for row in reader:
    device = row[0]
    state = row[1]
    model = row[2]
    substate=row[3]
    #time = row[4]

    if device in row:

        if substate == 'Not joined' and model !='electric_meter':
            print(state)
            if state == "Offline":
                N_off = [device]


            if state == 'Online':
                N_on = [device]

   # added condition to check if this variables are initialized or not.
            if 'N_on' in locals() and 'N_off' in locals() and N_off == N_on:
                print "Check passed"