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

时间:2009-03-19 22:21:53

标签: python variable-assignment variable-declaration

是否可以在Python中声明变量,如此?:

var

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

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

value

for index in sequence:

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

复制

相关

14 个答案:

答案 0 :(得分:296)

为什么不这样做:

var = None

Python是动态的,所以你不需要声明事物;它们自动存在于分配它们的第一个范围内。因此,您需要的只是上面的常规旧任务声明。

这很好,因为你永远不会得到一个未初始化的变量。但要小心 - 这并不意味着你不会最终得到错误的初始化变量。如果您向None初始化某些内容,请确保这是您真正想要的内容,并在可能的情况下分配更有意义的内容。

答案 1 :(得分:54)

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

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

答案 2 :(得分:13)

我不确定你要做什么。 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(序列)== 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)

答案 3 :(得分:10)

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

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

PEP 484引入了类型提示,即a.k.a。类型注释。虽然它的主要焦点是函数注释,但它还引入了类型注释的概念来注释变量:

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

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

captain: str  # Note: no initial value!

它似乎更直接地符合您的要求“是否可以仅在没有在Python中赋值的情况下声明变量?”

答案 4 :(得分:4)

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

的变量
var = ""

var = 0

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

var = Var()

答案 5 :(得分:3)

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

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

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

答案 6 :(得分:2)

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

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

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

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

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)]

答案 7 :(得分:2)

如果我正确理解你的例子,你无论如何都不需要在if语句中引用'value'。只要它可以被设置为任何东西,你就会脱离循环。

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

答案 8 :(得分:1)

你看起来像是在尝试用Python编写C语言。如果你想在序列中找到一些东西,Python就有内置函数来做,比如

value = sequence.index(blarg)

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

var_str = str()
var_int = int()

答案 11 :(得分:0)

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

var = object()

此哨兵由Nick Coghlan建议。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

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