353

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

var

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

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

value

for index in sequence:

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

复制

有关的

4

15 回答 15

438

为什么不这样做:

var = None

Python是动态的,所以你不需要声明东西;它们自动存在于分配它们的第一个范围内。因此,您所需要的只是上面的常规旧赋值语句。

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

于 2009-03-19T22:23:05.373 回答
61

在 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 中分配任何值?”

于 2017-11-08T21:14:32.330 回答
60

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

val = None
# ...
if val is None:
   val = any_object
于 2009-03-19T22:47:39.950 回答
16

我不确定你想做什么。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"

从这么短的代码示例中判断这是否真的是正确的风格有点困难,但它一种更“Pythonic”的工作方式。

编辑:下面是 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未绑定。

上面的代码是不可取的。其目的是说明局部变量是如何工作的,即“变量”是否“定义”在这种情况下只能在运行时确定。首选方式:

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)
于 2009-03-19T22:24:10.643 回答
3

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

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

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

于 2009-11-02T13:00:57.530 回答
2

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

var = ""

或者

var = 0

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

var = Var()
于 2009-03-19T22:24:31.267 回答
2

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

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

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

但更进一步,您已经给出了一个代码示例,其中有各种非常 Pythonic 的排列。您正在寻找一种扫描序列以查找匹配条件的元素的方法,因此这里有一些解决方案:

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

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

显然,在此示例中,您可以根据您想要实现的目标将 替换为raisea 。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)]
于 2009-03-19T22:59:51.917 回答
2

如果我正确理解了您的示例,则无论如何您都不需要在 if 语句中引用“值”。只要可以将其设置为任何内容,您就会跳出循环。

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 
于 2009-03-19T23:04:45.150 回答
1

您看起来像是在尝试用 Python 编写 C。如果你想在一个序列中找到一些东西,Python 有内置函数可以做到这一点,比如

value = sequence.index(blarg)
于 2009-03-19T23:03:49.957 回答
1

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

var = object()

这个哨兵是由Nick Coghlan建议的。

于 2016-10-12T09:13:59.603 回答
1

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

它与没有赋值的定义不同。我仍在试图弄清楚如何绕过这个问题。

于 2016-11-16T15:59:21.553 回答
1

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

def decl_var(var=None):
if var is None:
    var = []
var.append(1)
return var
于 2019-11-11T07:20:19.873 回答
0
var_str = str()
var_int = int()
于 2014-09-12T07:51:37.257 回答
0

你可以用这个丑陋的 oneliner 来欺骗解释器它除了向局部变量字典if None: var = None 添加一个变量,而不是初始化它之外什么都不做。var如果您之后尝试在函数中使用此变量,解释器将抛出 UnboundLocalError 异常。这也适用于非常古老的 python 版本。不简单,也不漂亮,但不要对 python 期望太多。

于 2018-01-15T02:13:37.433 回答
0

我知道它来晚了,但使用 python3,你可以通过使用声明一个未初始化的值

uninitialized_value:str

# some code logic

uninitialized_value = "Value"

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

uninitialized_value:str

# some code logic

# WILL NOT WORK
uninitialized_value += "Extra value\n"
于 2021-12-19T09:01:53.063 回答