具有不一致范围的Python变量

时间:2015-10-15 20:22:18

标签: python

python的新手,我在处理范围的方式中发现了一些奇怪的(作为非python dev)行为。

我有一个代码来解析参数并通过argparser使用它们。

缩短我正在做的基本版本:

import ...

def parser():
    parser = argparse.ArgumentParser(description='Do stuff')
    parser.add_argument('-key', dest='key', action='store', required=True)
    parser.add_argument('-start_date', dest='start_date', action='store', required=True)
    parser.add_argument('-end_date', dest='end_date', action='store')
    return parser.parse_args()

args = get_parser()
client_id = args.key
distance_in_meters = 5000

sdate = args.start_date
start_date = datetime(int(sdate[0:4]),int(sdate[4:6]),int(sdate[6:8]),int(sdate[8:10]))
end_date = datetime(datetime.now().year,datetime.now().month,datetime.now().day,datetime.now().hour,datetime.now().minute)
if args.end_date:
    end_date = datetime(int(args.end_date[0:4]),int(args.end_date[4:6]),int(args.end_date[6:8]),int(args.end_date[8:10]))

def search():
    # print example for the sake of stack overflow
    print "Kicking off search."
    print "Client ID:", client_id
    print "Distance in Meters:", distance_in_meters
    print "Start Date:", start_date

    ...

search()

这将在print "Start Date:", start_date错误输出之前打印所有内容,这是由UnboundLocalError: local variable 'start_date' referenced before assignment

引起的

这通常对我有意义,因为我没有设置任何global变量,

  • 为什么能够打印其他变量?
  • 为什么要将变量更改为sdate而不是start_date

我知道它可以打印,因为如果我移动

sdate = args.start_date
start_date = datetime(int(sdate[0:4]),int(sdate[4:6]),int(sdate[6:8]),int(sdate[8:10]))

并将其放在search():内,它会打印出来。

基于这个问题:“What is the scope of variables in JavaScript?”我的代码应该可以正常工作。

更新

我认为start_date / end_date可能是保留变量?

我想我的start_date中的parser()可能是某种冲突的变量。所以我将start_date = ...更改为start_date1 = ...并且神奇地print "Start Date:", start_date1似乎有效。

然而,我决定如果这不起作用,那么key(在解析器中)也不应该工作。所以我将代码start_date1 = ...更改为key = ...并且令人惊讶地“打印”开始日期:“,关键”仍然有用。

所以我想出了一个解决方案,但我仍然感到困惑。我没有在python的保留变量列表中看到start_date。

1 个答案:

答案 0 :(得分:0)

start_date绝对不是Python中的保留变量。

这个问题几乎肯定隐藏在您省略的代码区域中:

def search():
    # print example for the sake of stack overflow
    print "Kicking off search."
    print "Client ID:", client_id
    print "Distance in Meters:", distance_in_meters
    print "Start Date:", start_date

    ... #<- This bit

您几乎肯定会在省略的代码中的某个地方{@ 1}}进行分配。如果在函数中的某处为变量名赋值,则即使在赋值之前也无法访问同名的全局变量。有关详细信息,请参阅this SO post

有关此问题的说明,请尝试以下操作:

start_date