一种奇怪的情况。Python和范围
更具体地说,我将展示代码,然后解释发生了什么一种奇怪的情况。Python和范围,python,constants,scope,Python,Constants,Scope,更具体地说,我将展示代码,然后解释发生了什么 DATE = 'November' def commander(): pass class Circle(): pass def log(orig_stdout, rep_log): pass def debug(debugBool, info): pass def main(): Date = DATE 因此,假设每个函数都已填写,这不是重要的部分。重要的是main() 我认为常数具有全局范围?更
DATE = 'November'
def commander():
pass
class Circle():
pass
def log(orig_stdout, rep_log):
pass
def debug(debugBool, info):
pass
def main():
Date = DATE
因此,假设每个函数都已填写,这不是重要的部分。重要的是main()
我认为常数具有全局范围?更奇怪的是,它以前工作正常,但直到现在才引起问题。如果您愿意,我可以向您展示其余的代码,但是有点乱
TL;DR:日期的范围没有达到主要功能,为什么 很好,只读。。。因此,它必须是全局范围的日期
DATE = "November"
def main():
xyz=DATE
print "Date :",DATE
if __name__ == "__main__":
main()
不好(w/error),这是因为python认为您正在谈论的日期是您稍后指定的日期,这是一个局部变量,它会遮挡全局变量
DATE = "November"
def main():
xyz=DATE
print "Date :",DATE
DATE = 123
if __name__ == "__main__":
main()
很好(再次),现在python知道您在谈论全局变量DATE
DATE = "November"
def main():
global DATE
xyz=DATE
print "Date :",DATE
DATE = 123
if __name__ == "__main__":
main()
至少这是我对全球化的理解。通常更好的做法是使用带有默认变量的参数
def main(my_date=DATE):
#now there is no question and it will use global scope
#the downside is it is set to the value of DATE at run start not at the time it goes to main
好的,只读。。。因此,它必须是全局范围的日期
DATE = "November"
def main():
xyz=DATE
print "Date :",DATE
if __name__ == "__main__":
main()
不好(w/error),这是因为python认为您正在谈论的日期是您稍后指定的日期,这是一个局部变量,它会遮挡全局变量
DATE = "November"
def main():
xyz=DATE
print "Date :",DATE
DATE = 123
if __name__ == "__main__":
main()
很好(再次),现在python知道您在谈论全局变量DATE
DATE = "November"
def main():
global DATE
xyz=DATE
print "Date :",DATE
DATE = 123
if __name__ == "__main__":
main()
至少这是我对全球化的理解。通常更好的做法是使用带有默认变量的参数
def main(my_date=DATE):
#now there is no question and it will use global scope
#the downside is it is set to the value of DATE at run start not at the time it goes to main
请修复您的格式-目前来看,这是无效的python代码,我不能完全猜测它应该如何缩进。。。但是,如果您要指定日期,则需要执行全局日期。。。或者,它会认为您谈论的日期只是本地的(除非您在设置之前明确地说是全局日期),这个示例对我很有用。最有可能的是,main()包含一个到目前为止的赋值,该赋值未在示例中显示(请参见下面的答案),这也是我的怀疑;)解决了这个问题,正如Beasley所说,我在main()中重新分配了一个日期,它是相当隐藏的。请修复您的格式设置-目前这是无效的python代码,我不能完全猜测它应该如何缩进。读取范围应该。。。但是,如果您要指定日期,则需要执行全局日期。。。或者,它会认为您谈论的日期只是本地的(除非您在设置之前明确地说是全局日期),这个示例对我很有用。最有可能的是,main()包含一个到目前为止的赋值,该赋值未在示例中显示(请参见下面的答案),这也是我的怀疑;)解决了问题,正如Beasley所说,我在main()中重新分配了一个日期,它是相当隐藏的。我不会说xyz=DATE
中的日期是一个全局名称,它是一个自由名称,根据文档中的定义:“如果在代码块中使用了一个变量,但没有在那里定义,它就是一个自由变量。”(我不喜欢使用“变量”这个词)因此DATE=123
倾向于将DATE设置为本地名称,这与同一个名称之前的自由名称状态相冲突。语句global DATE
防止名称日期被解释器视为本地日期,仅仅因为赋值DATE=123
,从定义的角度来看,您是正确的。但是从实践的角度来看,我相信我的陈述是正确的(除了我上面所说的,我没有看到任何行为,但是在某些情况下,我上面所说的可能是错误的)。我想我会在这里回答,您预先设置全局的示例很有效,但这成为一个问题,因为我有很多全局变量…我不会说xyz=DATE
中的日期是一个全局名称,它是一个自由名称,根据文档中的定义:“如果一个变量在代码块中使用,但没有在代码块中定义,那么它就是一个自由变量。”(我不喜欢使用‘变量’这个词)因此DATE=123
倾向于将DATE设置为本地名称,这与同一个名称之前的自由名称状态相冲突。语句global DATE
防止名称日期被解释器视为本地日期,仅仅因为赋值DATE=123
,从定义的角度来看,您是正确的。但是从实践的角度来看,我相信我的陈述是正确的(除了我上面所说的,我没有看到任何行为,但是在某些情况下,我上面所说的可能是错误的)。我想我会在这里回应,你预先设置全局的例子是有效的,但这成为一个问题,因为我有很多全局变量。