是否可以在Python中只声明一个变量而不赋值?

是否可以像这样在Python中声明一个变量?:

var

使它初始化为None?Python似乎允许这样做,但一旦你访问它,它就崩溃了。这可能吗?如果不是,为什么?

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

value


for index in sequence:


if value == None and conditionMet:
value = index
break

相关问题

另请参阅

676895 次浏览

为什么不这样做呢:

var = None

Python是动态的,所以你不需要声明;它们自动存在于分配给它们的第一个作用域中。所以,你所需要的只是上面提到的一个常规的赋值语句。

这很好,因为您将永远不会得到一个未初始化的变量。但是要注意——这并不意味着你不会得到不正确初始化的变量。如果你初始化一些东西到None,确保这是你真正想要的,并分配一些更有意义的东西,如果可以的话。

我不知道你想干什么。Python是一种非常动态的语言;在实际分配或使用变量之前,通常不需要声明变量。我觉得你想做的就是

foo = None

它将值None赋给变量foo

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

#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()引发异常,则found将被解除绑定 注意:如果len(sequence) == 0,则item被解除绑定

以上代码是不可取的。它的目的是说明局部变量是如何工作的,即在这种情况下,“变量”是否“定义”只能在运行时确定。 更可取的方式:< / p >

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)

我通常将变量初始化为表示类型的东西,例如

var = ""

var = 0

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

var = Var()

我衷心建议你阅读其他语言有“变量”;(我添加了一个相关链接)-在两分钟内你就会知道Python有“名称”,而不是“变量”。

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

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

问:我如何发现一个变量是否在我的代码中定义了?

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

而且,您已经给出了一个代码示例,其中有各种相当python化的排列。你正在寻找一种方法来扫描序列中匹配条件的元素,所以这里有一些解决方案:

def findFirstMatch(sequence):
for value in sequence:
if matchCondition(value):
return value


raise LookupError("Could not find match in sequence")

显然,在这个例子中,你可以根据你想要实现的目标,将raise替换为return None

如果你想要所有符合条件的东西,你可以这样做:

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


return matches

还有另一种使用yield的方法,我不会费心向你展示,因为它的工作方式相当复杂。

此外,还有一种实现这一目标的方法:

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

你看起来像在用Python写C语言。如果你想在一个序列中找到一些东西,Python有内置的函数来做这件事,比如

value = sequence.index(blarg)

如果我对你的例子理解正确,你不需要在If语句中引用“value”。一旦它可以被设置为任何值,就会跳出循环。

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

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

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

如果它是您正在寻找的局部变量,则将globals()替换为locals()。

var_str = str()
var_int = int()

如果None是有效的数据值,则需要以另一种方式对变量进行修改。你可以用:

var = object()

这个哨兵是由尼克Coghlan建议的。

在Python 3.6+中,你可以使用变量注释:

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

PEP 484引入了类型提示,也就是类型注释。虽然它的主要关注点是函数注释,但它也引入了类型注释的概念来注释变量:

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

PEP 526旨在为Python添加注释变量类型的语法(包括类变量和实例变量),而不是通过注释来表示它们:

captain: str  # Note: no initial value!

这似乎更直接地符合你的问题“是否可能在Python中只声明一个变量而不赋值?”

注意:Python运行时不强制函数和变量类型注释。它们可以被第三方工具使用,如类型检查器、ide、linter等。

你可以用这个丑陋的联机程序if None: var = None欺骗一个解释器 它所做的只是将变量var添加到局部变量字典中,而不是初始化它。解释器将抛出UnboundLocalError异常,如果你试图在一个函数之后使用这个变量。这也适用于非常古老的python版本。不简单,也不漂亮,但不要对python有太多期望

是否可以在Python中声明一个变量(var=None):

def decl_var(var=None):
if var is None:
var = []
var.append(1)
return var

我知道这有点晚了,但是在python3中,你可以使用

uninitialized_value:str


# some code logic


uninitialized_value = "Value"

但是使用这个技巧要非常小心,因为

uninitialized_value:str


# some code logic


# WILL NOT WORK
uninitialized_value += "Extra value\n"