Python中未初始化的值?

Python中未初始化的值?,python,Python,Python中的未初始化值是多少,因此我可以比较是否初始化了某些内容,例如: val if val == undefined ? 编辑:添加了一个伪关键字 EDIT2:我想我没有说清楚,但是说val已经在那里了,但是没有分配任何东西给它 重复:将引发名称错误异常: >>> val Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: na

Python中的未初始化值是多少,因此我可以比较是否初始化了某些内容,例如:

val

if val == undefined ?
编辑:添加了一个伪关键字

EDIT2:我想我没有说清楚,但是说val已经在那里了,但是没有分配任何东西给它


重复:将引发
名称错误
异常:

>>> val
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'val' is not defined


在python中,变量要么引用对象,要么不存在。如果它们不存在,则会出现名称错误。当然,它们可能引用的对象之一是
None

try:
   val
except NameError:
   print "val is not set"


if val is None:
   print "val is None"
添加到:您可以使用获取当前范围内所有变量的列表,因此如果要测试
var
是否在当前范围内而不使用异常,可以执行以下操作:

if 'var' in dir():
    # var is in scope

除非为名称指定了值,否则名称不存在。没有,它通常表示没有可用的值,但它本身就是一个值。

在Python中,要使变量存在,必须为其分配了某些内容。您可以将变量名视为一个字典键,它必须有一些与之相关的值(即使该值为无)。

Q:如何发现变量是否在代码中的某个点定义?


A:仔细阅读源文件,直到看到定义该变量的行。

这个问题引出了一些有趣的关于python对象及其垃圾收集器性质的转移:

了解python中的所有变量实际上都是指针可能会有所帮助,也就是说,它们是命名空间(实现为哈希表)中的名称,指向对象实际驻留的内存中的地址

请求未初始化变量的值与在指针尚未创建时请求指针指向的对象的值相同。。。这显然是胡说八道,这就是为什么Python可以做的最明智的事情就是抛出一个有意义的名称错误

python语言的另一个奇怪之处是,对象可能在执行赋值语句之前很久就存在了。考虑:

a = 1
你在这里神奇地创建了一个int(1)对象吗?不,它已经存在了。由于int(1)是一个不可变的单例,因此已有几百个指向它的指针:

>>> sys.getrefcount(a)
592
>>>
有趣,嗯

编辑:JFS的命令(发布在此处以显示代码)


通常使用
None
值将某个对象标记为“已声明但尚未初始化;在代码

中,我会考虑一个未初始化的变量一个Dekkt,所以我不能假定Valo是没有的吗?您可以使用val=None进行“初始化”,但这可能是非音速的。谢谢Dana。我只是想知道它是否初始化了。你能告诉我们你为什么要这么做吗?可能有一种更为“pythonic”的方式来完成您试图完成的任务。因为变量只是附加到对象上的标签,所以整个问题非常不符合pythonic。“未初始化”的概念不可能存在——这个问题很奇怪。局部范围中可能存在未绑定的LocalError。@J.F.Sebastian,哈?UnboundLocalError是NameError的一个子类,不是吗?@phihag:是的。我认为有必要指出“UnboundLocalError:赋值前引用的局部变量'val'与”NameError:未定义全局名称'val'之间的区别。如果val稍后在同一函数中被赋值,您将得到一个ULE。回答错误。var=没有一个是他想要的。见他的重复问题
if 'var' in dir():
    # var is in scope
a = 1
>>> sys.getrefcount(a)
592
>>>
>>> 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