范围不一致的Python变量

范围不一致的Python变量,python,Python,python新手,我发现它处理作用域的方式有些奇怪(作为非python开发人员) 我有一个解析参数并通过argparser使用它们的代码 我正在做的事情的简化基本版本: import ... def parser(): parser = argparse.ArgumentParser(description='Do stuff') parser.add_argument('-key', dest='key', action='store', required=True)

python新手,我发现它处理作用域的方式有些奇怪(作为非python开发人员)

我有一个解析参数并通过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:分配前引用的局部变量“Start_Date”引起的。

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

  • 为什么它能够打印其他变量
  • 为什么将变量更改为
    sdate
    而不是
    start\u 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()中:
它会打印出来

基于这个问题:“我的代码应该可以正常工作

更新

我认为
start\u date
/
end\u date
可能是保留变量

我想我的
parser()
中的
start\u date
可能是冲突变量。因此,我将
start\u date=…
更改为
start\u date1=…
并神奇地
打印“start date:”,start\u date1
似乎有效

然而,我决定如果这不起作用,那么
键(在解析器中)也不应该起作用。因此,我将代码
start\u date1=…
更改为
key=…
,令人惊讶的是,“打印”开始日期:“,key”仍然有效


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

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

嗯。我明白了。python处理这个问题的方式很有趣。和我习惯的非常不同。谢谢。
>>> s = 1
>>> def f():
...     print s
>>> print f()
1

>>> s = 1
>>> def g():
...     print s
...     s = 2
>>> print g()
Traceback (most recent call last):

UnboundLocalError: local variable 's' referenced before assignment