[英]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.