Python中的未初始化值?
Posted
技术标签:
【中文标题】Python中的未初始化值?【英文标题】:Uninitialized value in Python? 【发布时间】:2010-10-14 10:25:25 【问题描述】:Python中未初始化的值是什么,所以我可以比较是否有初始化,比如:
val
if val == undefined ?
编辑:添加了一个伪关键字。
EDIT2:我想我没有说清楚,但说 val 已经存在,但没有分配任何东西。
重复:Just declaring a variable in Python?
【问题讨论】:
您能告诉我们您为什么要这样做吗?可能有一种更“pythonic”的方式来完成你想要做的事情。 由于变量只是附加到对象的标签,因此整个问题非常非pythonic。不能存在“未初始化”的想法——这个问题很奇怪。 【参考方案1】:会抛出NameError
异常:
>>> val
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'val' is not defined
您可以抓住它或使用'val' in dir()
,即:
try:
val
except NameError:
print("val not set")
或
if 'val' in dir():
print('val set')
else:
print('val not set')
【讨论】:
本地范围内可能存在 UnboundLocalError。 @J.F.塞巴斯蒂安 嗯? UnboundLocalError 是 NameError 的子类,不是吗? @phihag:是的。我认为值得指出“UnboundLocalError: local variable 'val' referenced before assignment”和“NameError: global name 'val' is not defined”之间的区别。 如果 val 稍后在同一函数中分配给您,您将获得 ULE。 错误答案。 var = None 是他想要的。查看他的重复问题【参考方案2】:在python中,变量要么引用一个对象,要么不存在。如果它们不存在,您将收到 NameError。当然,他们可能引用的对象之一是None
。
try:
val
except NameError:
print "val is not set"
if val is None:
print "val is None"
【讨论】:
所以我不能假设 val 是 None 吗? 不,val 直到您第一次引用它时才会存在。您可以执行 val = None 来“初始化”,但这可能是非 Python 的。 谢谢达娜。就是想知道有没有初始化。【参考方案3】:名称不存在,除非为其分配了值。有None,一般表示没有可用的值,但它本身就是一个值。
【讨论】:
【参考方案4】:这个问题引出了一些关于 python 对象的性质和它的垃圾收集器的有趣转移:
理解python中的所有变量实际上都是指针可能会有所帮助,即它们是命名空间中的名称(实现为哈希表),指向对象实际所在的内存地址。
询问未初始化变量的值与询问指针尚未创建时指向的事物的值是一样的......这显然是无稽之谈,这就是为什么 Python 可以做的最明智的事情做的是抛出一个有意义的 NameError。
python 语言的另一个奇怪之处在于,一个对象可能在你执行赋值语句之前很久就存在了。考虑:
a = 1
你在这里神奇地创建了一个 int(1) 对象吗?不——它已经存在了。由于 int(1) 是一个不可变的单例,因此已经有几百个指向它的指针:
>>> sys.getrefcount(a)
592
>>>
有趣,嗯?
编辑: JFS 的评论(张贴在这里显示代码)
>>> a = 1 + 1
>>> sys.getrefcount(a) # integers less than 256 (or so) are cached
145
>>> b = 1000 + 1000
>>> sys.getrefcount(b)
2
>>> sys.getrefcount(2000)
3
>>> sys.getrefcount(1000+1000)
2
【讨论】:
【参考方案5】:在 Python 中,要存在一个变量,必须为它分配一些东西。你可以把你的变量名想象成一个字典键,它必须有一些与之关联的值(即使那个值是 None)。
【讨论】:
【参考方案6】:问:如何发现变量是否在我的代码中的某个点定义?
答:在源文件中阅读,直到看到定义了该变量的行。
【讨论】:
【参考方案7】:通常None
的值用于将某些内容标记为“已声明但尚未初始化;我会认为未初始化的变量是代码中的缺陷
【讨论】:
【参考方案8】:try:
print val
except NameError:
print "val wasn't set."
【讨论】:
【参考方案9】:要添加到phihag's answer:您可以使用dir()
来获取当前范围内所有变量的列表,因此如果您想在不使用异常的情况下测试var
是否在当前范围内,您可以可以做到:
if 'var' in dir():
# var is in scope
【讨论】:
以上是关于Python中的未初始化值?的主要内容,如果未能解决你的问题,请参考以下文章