基本上我有一些我不想预先初始化的变量:
originalTime = None
recentTime = None
postTime = None
def DoSomething ( ) :
if originalTime == None or (postTime - recentTime).seconds > 5 :
...
我在if:
上遇到编译错误UnboundLocalError: local variable 'originalTime' referenced before assignment
正如您所看到的,所有变量都有不同的关系,要么必须设置正确(时间,时间+ 5等),要么根本不设置,但我不想在声明它们时将它们设置为预先计算的值无更容易。
有什么想法吗?
答案 0 :(得分:14)
我需要纠正Jarret Hardie,因为我没有足够的代表发表评论。
全球范围不是问题。 Python将自动在封闭范围内查找变量名称。唯一的问题是您想要更改值。如果您只是重新定义变量,Python将创建一个新的局部变量,除非您使用global关键字。所以
originalTime = None
def doSomething():
if originalTime:
print "originalTime is not None and does not evaluate to False"
else:
print "originalTime is None or evaluates to False"
def doSomethingElse():
originalTime = True
def doSomethingCompletelyDifferent()
global originalTime
originalTime = True
doSomething()
doSomethingElse()
doSomething()
doSomethingCompletelyDifferent()
doSomething()
应输出:
originalTime is None or evaluates to False
originalTime is None or evaluates to False
originalTime is not None and does not evaluate to False
我再次警告这是一个糟糕的设计。
答案 1 :(得分:6)
你的代码应该有效,我猜它是在一个函数里面,但是originalTime是在别的地方定义的。
如果这是你真正想要的,甚至更好的originalTime is None
,那么说not originalTime
也好一点。
答案 2 :(得分:0)
如果if
语句在函数内部,但= None
声明在模块级别,则变量超出函数范围。最简单的解决方法是明确指出变量标识符可以在全局范围内找到:
def doSomething():
global originalTime
if originalTime:
print "originalTime exists and does not evaluate to False"
很多人认为这是糟糕的Python设计,顺便说一句。如果您同意该评估,并且您的体系结构允许,您可能希望重构您的函数,以便它接收外部依赖项作为函数参数。
答案 3 :(得分:0)
==>如果初始值为无
>>>toto = None
>>>toto = toto if toto is not None else "default Value"
>>>toto
'default value'
==>如果变量不存在
>>>del toto
>>>toto = toto if locals().get('toto') else "default Value"
>>> toto
'default value'
==>设置值时的相同命令
>>>toto = 1
>>>toto
1
>>>toto = toto if locals().get('toto') else "default Value"
1
答案 4 :(得分:-2)
我刚尝试了shell中的代码,但没有收到错误。它应该工作。也许发布整个代码? 您也可以使用try / catch。
或者也许是locals()。has_key('originalTime')?
答案 5 :(得分:-2)
这并没有任何“漂亮”的方式。只是基于你给出的变量名,我的第一直觉就是创建一个对象:
class SomeTimeClass(object):
def __init__(self, recentTime=None, originalTime=None, postTime=None):
self.recentTime = recentTime
self.originalTime = originalTime
self.postTime = postTime
time = SomeTimeClass()
if not time.recentTime::
...
这可能有效,因为它听起来像变量是相关的。其他几个选择:
将程序包裹在一个函数中:
def SomeFunc(recentTime=None, originalTime=None, postTime=None):
if not recentTime:
...
使用dict:
some_dict = {}
if not some_dict.get('originalTime', None): #return None if key doesn't exist
...