是否有可能只声明一个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 None
replace这个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中赋值?