“本地和全局”SyntaxError

时间:2015-03-24 09:00:15

标签: python python-3.x

为什么函数openFehBgQ不像标记为评论1&的两条指令。 2?

注释1尝试更新fehCurrent,它被声明为global,但会产生以下错误:

      SyntaxError: name 'fehCurrent' is local and global ;

评论2根本不起作用,尽管timeKill功能会记住time.sleep

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import glob, subprocess, time, os

def globalVariables():
    global fehCurrent # Title (str) of current 'Child' window
    global fehNew # Title (str) of new 'Child' window
    global fehWindow # Data (array) for current 'Child' window
    global timeKill
    global timeZero


# Data (array) for current 'Child' window
fehBg = ['fehBg', '-g', '%ux%u+%u+%u' % (320, 240,  
    50,50), '-x', 'Media/Bg.jpg']
fehCurrent = 'fehq1'    # Title (str) of current 'Child' window

def openFehBgQ():
    if fehCurrent != fehNew:
        subprocess.Popen(fehWindow)
        time.sleep(timeKill)
        os.popen('%s%s' % ('pkill ', fehCurrent))
        # fehCurrent = fehNew    # See Comment 1
        timeElapsed = 0
        # timeZero = time.time()    # See Comment 2

fehNew = "fehBg"
fehWindow = fehBg
openFehBgQ() 
print "1_", fehCurrent
fehCurrent = fehNew
print "2_", fehCurrent
timeZero = time.time()

2 个答案:

答案 0 :(得分:1)

global语句告诉Python的解释器,给定的变量名称是指全局变量,而不是本地变量。如果您要分配给变量,则只需使用它。如果您只访问其现有值,则无需进行global声明。

您在openFehBG中收到错误,因为您正在访问变量fehCurrrent,后来尝试分配相同的名称,默认情况下会创建一个本地变量。不允许这种无序访问。你需要一个global语句来使查找和赋值都引用全局变量。

也就是说,使用全局变量,有或没有global语句通常是设计不良的症状。你应该将参数传递给你的函数,并保存它们的返回值,而不是有很多全局变量来跟踪。

答案 1 :(得分:0)

使用最少行数按预期工作的版本将是:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time

fehCurrent = "fehQ1"

def open_feh_bg(fehCurrent, fehNew):
    if fehCurrent != fehNew:
        timeZero = time.time()
        return timeZero

fehNew = "fehBg"
open_feh_bg(fehCurrent, fehNew) 
fehCurrent = fehNew

感谢您的帮助。