是否有可能只声明一个variables没有在Python中分配任何值?

是否有可能在Python中声明一个variables,像这样?

var 

所以它初始化为None? Python似乎允许这样做,但只要你访问它,就会崩溃。 这可能吗? 如果没有,为什么?

编辑:我想这样做的情况下这样做:

 value for index in sequence: if value == None and conditionMet: value = index break 

重复

  • 在Python中未初始化的值 (由同一作者)
  • Python中是否有任何声明关键字? (由同一作者)

有关

  • Python:variables范围和函数调用
  • 其他语言有“variables”

为什么不这样做:

 var = None 

Python是dynamic的,所以你不需要声明事物; 它们自动存在于分配的第一个作用域中。 所以,你需要的只是一个正常的旧的赋值语句。

这很好,因为你永远不会结束一个未初始化的variables。 但要小心 – 这并不意味着你不会以不正确的初始化variables结束。 如果你初始化为None ,确保这是你真正想要的,并且如果可以的话,分配一些更有意义的东西。

我衷心推荐你阅读其他语言有“variables” (我把它添加为一个相关的链接) – 两分钟后,你会知道Python有“名称”,而不是“variables”。

 val = None # ... if val is None: val = any_object 

我不确定你在做什么。 Python是一种非常dynamic的语言, 你通常不需要声明variables,直到你真的要分配或使用它们。 我想你想要做的只是

 foo = None 

这会将值None分配给variablesfoo

编辑:你真的似乎想要做的只是这个:

 #note how I don't do *anything* with value here #we can just start using it right inside the loop for index in sequence: if conditionMet: value = index break try: doSomething(value) except NameError: print "Didn't find anything" 

从这样一个简短的代码示例来看,这是否真的是一种合适的风格,但是这一种更“Python化”的工作方式。

编辑:下面是由JFS评论(张贴在这里显示的代码)

与OP的问题无关,但上面的代码可以被重写为:

 for item in sequence: if some_condition(item): found = True break else: # no break or len(sequence) == 0 found = False if found: do_something(item) 

注意:如果some_condition()引发一个exception,那么found是未绑定的。
注意:如果len(sequence)== 0,则item被解除绑定。

上面的代码是不可取的。 它的目的是说明局部variables是如何工作的,即“variables”是否是“已定义的”,只能在运行时才能确定。 优选方式:

 for item in sequence: if some_condition(item): do_something(item) break 

要么

 found = False for item in sequence: if some_condition(item): found = True break if found: do_something(item) 

那么,如果你想检查一个variables是否定义了,那么为什么不检查它在locals()或globals()数组中? 你的代码改写了:

 for index in sequence: if 'value' not in globals() and conditionMet: value = index break 

如果它是你正在寻找的局部variables,则用locals()replaceglobals()。

我通常初始化variables来表示types

 var = "" 

要么

 var = 0 

如果它是一个对象,那么在实例化之前不要初始化它:

 var = Var() 

首先,我回答你最初提出的问题

问:如何发现variables是否在我的代码中的某个点上定义?

答:在源文件中进行阅读,直到看到定义该variables的行。

但进一步,你已经给出了一个代码示例,有各种各样的排列是pythonic。 您正在扫描一个匹配条件的元素的序列,所以这里有一些解决scheme:

 def findFirstMatch(sequence): for value in sequence: if matchCondition(value): return value raise LookupError("Could not find match in sequence") 

很显然,在这个例子中,你可以用一个return Nonereplace这个raise ,这取决于你想达到什么目的。

如果你想要的一切都符合条件,你可以这样做:

 def findAllMatches(sequence): matches = [] for value in sequence: if matchCondition(value): matches.append(value) return matches 

还有另外一种方法可以做到这一点,我不打扰你,因为它的工作方式非常复杂。

此外,还有一条实现这一目标的途径:

 all_matches = [value for value in sequence if matchCondition(value)] 

如果我正确地理解你的例子,那么无论如何你都不需要在if语句中引用“value”。 只要可以设置任何东西,你就会马上跳出循环。

 value = None for index in sequence: doSomethingHere if conditionMet: value = index break 

你看起来像你正在试图用Python编写C语言。 如果你想按顺序查找某些东西,Python就有内build的function来做这件事

 value = sequence.index(blarg) 
 var_str = str() var_int = int() 

这是一个很好的问题,不幸的是,糟糕的答案是var = None已经分配了一个值,如果你的脚本运行多次,每次都会被None覆盖。

这与定义没有分配不一样。 我仍然试图找出如何绕过这个问题。

如果None是一个有效的数据值,那么你需要另一种方式。 你可以使用:

 var = object() 

Nick Coghlanbuild议这个哨兵。

在Python 3.6 +中,你可以使用variables注解来实现这个function:

https://www.python.org/dev/peps/pep-0526/#abstract

PEP 484引入了types提示,也就是types注释。 虽然它的主要焦点是函数注释,但它也引入了types注释的概念来注释variables:

 # 'captain' is a string (Note: initial value is a problem) captain = ... # type: str 

PEP 526旨在为Python添加注释variablestypes(包括类variables和实例variables)的语法,而不是通过注释expression它们:

 captain: str # Note: no initial value! 

它似乎更直接符合你所问的问题:“是否可以只声明一个variables,而不用在Python中赋值?