2013-11-15 56 views
-2

我是新来的Python,我不明白这是如何工作的。我想为Python中的一个对象赋值,如果它目前未定义的话,但是当我运行if语句时,它会失败,因为对象没有定义(Duh。)。Python - 检查空对象

我该如何解决这个问题?

... 
key = raw_input('What is your key?: ') 

for i in key: 
    print i 
    if Count is None: 
     Count = 0 

Traceback (most recent call last): 
    File "Client.py", line 7, in <module> 
    if Count is None: 
NameError: name 'Count' is not defined 

我能做些什么来解决这个看似简单的问题?

上面的代码是垃圾,是我测试的基本Python功能的理解。它让我回到了为一个对象分配值的问题,这是我之前遇到的一个问题。以下是我的思考过程。

好吧,很显然我在这里没有足够的解释。我不确定它是什么,但是有些东西让我不得不为一个不相关的对象赋值。 为了便于阅读,我希望在语句中使用它之前检查对象的空值。从我在下面看到的内容来看,这将是必要的,而且我很可能不得不面对。在我看来,这...

... 
object = 'ObligatoryValue' 

for i in Data 
    Object = Data[0] # Now the object is relevant 
    ... 

看起来比这更好的...

... 
for i in Data 
    if Object is None: 
     Object = Data[0] 
    ... 

为了进一步解释的理由,我在数据处理工作。我第一次遇到这个问题是当我比较两个对象时。如果试图做类似...

... 
Object = Line[0] 
if UndefinedObject == Object 
    do = 'something' 
... 

但我总是有一个错误返回,因为UndefinedObject没有分配一个值。

+1

计数是什么? –

+1

你不能。作业*是*定义名称。你可以检查是否已经分配了一个全局,但你通常不会。你的用例是什么? –

+0

您可以先将'None'分配给'Count';在顶部添加'Count = None',但是确实有点小问题。 –

回答

5

您可以设置CountNone明确的,第一:

Count = None 

for i in key: 
    if Count is None: 
     Count = 0 

但在这种情况下,它会更容易只分配0开始说起:

Count = 0 

for i in key: 
-2

你可以将它定义为空串之前你可以检查:

Count = '' 

然后你可以测试...

if not Count: 
    Count = 0; 
+2

为什么要将它定义为空字符串,而不是Python中惯用的“空值”,例如'None',正如Martijn Pieters的回答所示? – abarnert

+0

尽管最终结果是相同的......“if not Count:”位在逻辑上与原始问题试图执行的内容一致(如果count还没有被赋值,那么赋值为“”)。 至少这将是我的意见... – MrBooks

+0

它比原来的东西更符合逻辑上的原则吗?此外,这种检查甚至不起作用,因为'不计数'对于' 0',因为它是''''。 – abarnert

2

这几乎肯定是一个非常糟糕的主意。正如大家在评论中所解释的那样,Martijn Pieters的回答显示,有更好的方式去做几乎任何你想做的事情。

此外,这是而不是“检查空对象”。 “空对象”是None。 Martijn的答案显示了如何做到这一点。这是检查变量没有被绑定,而不是被绑定到空对象的变量。不管怎样,Python并不妨碍你这样做,它只是不容易(因为它的几乎是总是一个坏主意,但偶尔也是必要的)。

所以,这里是如何做到这一点:

for i in key: 
    try: 
     Count 
    except NameError: 
     Count = 0 

或者,如果你需要知道它是否存在于一个特定的范围 - 例如,你只要有一个全球Count,不是Count关心任何地方:

for i in key: 
    if 'Count' not in globals(): 
     Count = 0 

或者你也可以在适当的命名空间使用hasattrgetattr

+0

我喜欢你在那里的第二个陈述。这对我来说似乎更加干净。请原谅我对Python的基本用法的无知。我只用了几天。这次真是万分感谢。 – vbiqvitovs

+0

@vbiqvitovs:我明确地避免告诉你如何做到这一点(我只说过它是可能的)。它通常表明你正在尝试做你真正不应该做的事情,或者至少根本不需要做。你可以逆流游泳,但为什么这么努力呢? –

+0

@vbiqvitovs:如果你只用了几天Python,我甚至更确定你不想这样做。我在猜测你是新手程序员,还是来自Javascript,对'undefined'的测试是惯用的和常见的,对吗?解释你实际上想要做什么,并且我们可以告诉你如何在Python中做得很好,而不是告诉你如何将Python用作糟糕的JavaScript版本。 – abarnert