是否可以仅在没有在Python中赋值的情况下声明变量?

Is it possible only to declare a variable without assigning any value in Python?

是否可以像这样在python中声明变量?:

1
var

所以它初始化为"无"?似乎Python允许这样做,但一旦您访问它,它就会崩溃。这有可能吗?如果没有,为什么?

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

1
2
3
4
5
6
7
value

for index in sequence:

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

号复制

  • python中未初始化的值(由同一作者提供)
  • python中有声明关键字吗?(同一作者)

相关的

  • python:变量范围和函数调用
  • 其他语言有"变量"


为什么不这么做:

1
var = None

python是动态的,所以您不需要声明事物;它们自动存在于分配它们的第一个作用域中。所以,您所需要的只是一个常规的旧的分配语句,如上所述。

这很好,因为最终不会得到未初始化的变量。但是要小心——这并不意味着你最终不会得到错误初始化的变量。如果你给None初始化一些东西,确保这是你真正想要的,如果可以的话,分配一些更有意义的东西。


我衷心建议您阅读其他语言中的"变量"(我将其添加为相关链接)–两分钟后,您就会知道python有"名称",而不是"变量"。

1
2
3
4
val = None
# ...
if val is None:
   val = any_object


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

1
foo = None

它将值None分配给变量foo

编辑:你真正想做的是:

1
2
3
4
5
6
7
8
9
10
11
12
#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的问题无关,但上述代码可以改写为:

1
2
3
4
5
6
7
8
9
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未绑定。

不建议使用上述代码。它的目的是说明局部变量是如何工作的,也就是说,在这种情况下,"变量"是否"定义"只能在运行时确定。首选方式:

1
2
3
4
for item in sequence:
    if some_condition(item):
       do_something(item)
       break

1
2
3
4
5
6
7
8
found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)


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

https://www.python.org/dev/peps/pep-0526/摘要

PEP484引入了类型提示,也就是A.K.A.类型注释。虽然它的主要焦点是函数注释,但它还引入了类型注释的概念来注释变量:

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

PEP 526旨在为python添加语法,以注释变量类型(包括类变量和实例变量),而不是通过注释来表达:

1
captain: str  # Note: no initial value!

它似乎更直接地符合您所问的"是否只可能声明一个变量而不在python中赋值?"


我通常将变量初始化为表示

1
var =""

1
var = 0

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

1
var = Var()


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

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

如果是您要查找的局部变量,则将globals()替换为local s()。


如果我理解您的示例是正确的,那么无论如何,您不需要在if语句中引用"value"。一旦它可以被设置为任何值,你就会跳出这个循环。

1
2
3
4
5
6
value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break


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

问:如何发现代码中某个点是否定义了变量?

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

但更进一步,您已经给出了一个代码示例,其中有各种各样的排列,它们都是非常Python式的。您正在寻找一种方法来扫描序列中符合条件的元素,因此这里有一些解决方案:

1
2
3
4
5
6
def findFirstMatch(sequence):
    for value in sequence:
        if matchCondition(value):
            return value

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

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

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

1
2
3
4
5
6
7
def findAllMatches(sequence):
    matches = []
    for value in sequence:
        if matchCondition(value):
            matches.append(value)

    return matches

还有另一种方法可以使用yield,我不想麻烦向您展示,因为它的工作方式非常复杂。

此外,实现这一目标的方法只有一条:

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


这是一个好问题,不幸的是,回答错误,因为var = None已经分配了一个值,如果脚本运行多次,则每次都会被None覆盖。

它与不进行赋值的定义不同。我仍在努力解决如何绕过这个问题。


您看起来像是在用Python编写C。如果您想在序列中找到一些东西,python有内置的函数来完成这项工作,比如

1
value = sequence.index(blarg)


你可以用这个难看的单行线来欺骗一个口译员。它除了向局部变量字典中添加一个变量var之外什么也不做,而不是初始化它。如果您以后尝试在函数中使用此变量,解释器将抛出UnboundLocalError异常。这也适用于非常古老的Python版本。不简单,也不漂亮,但不要对Python有太大期望。


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

1
var = object()

这个哨兵是尼克·科格伦建议的。


1
2
var_str = str()
var_int = int()