Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一种奇怪的情况。Python和范围_Python_Constants_Scope - Fatal编程技术网

一种奇怪的情况。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
,从定义的角度来看,您是正确的。但是从实践的角度来看,我相信我的陈述是正确的(除了我上面所说的,我没有看到任何行为,但是在某些情况下,我上面所说的可能是错误的)。我想我会在这里回应,你预先设置全局的例子是有效的,但这成为一个问题,因为我有很多全局变量。