繁体   English   中英

作用域不一致的Python变量

[英]Python Variables with Inconsistent Scope

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之前打印所有内容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():它将打印出来。

基于以下问题:“ JavaScript中变量的范围是什么? ”我的代码应该可以正常工作。

更新

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

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

但是,我决定是否不起作用,则key (位于解析器中)也不应该起作用。 所以我将代码start_date1 = ...更改为key = ... ,令人惊讶的是,“ print“ Start Date:”,key“仍然有效。

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

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

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

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

几乎可以肯定,您将在省略的代码中某处对start_date进行赋值。 如果在函数中的某个位置为变量名称分配值,则即使在赋值之前,也无法访问具有相同名称的全局变量。 有关更多详细信息,请参见此SO帖子

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

>>> 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM