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

var

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

编辑:我想对这样的情况执行此操作:

value

for index in sequence:

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

复制

有关的

有帮助吗?

解决方案

为什么不这样做:

var = None

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

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

其他提示

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

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

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

在 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中是否可以只声明一个变量而不分配任何值?”

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

var = ""

或者

var = 0

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

var = Var()

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

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

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

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

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

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

但更进一步,您给出了一个代码示例,其中有各种排列,这些排列非常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)]

如果我正确理解您的示例,那么您无论如何都不需要在 if 语句中引用“值”。一旦它可以设置为任何值,您就可以跳出循环。

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

你看起来像是在尝试用 Python 编写 C 语言。如果你想在序列中查找某些内容,Python 有内置函数可以做到这一点,例如

value = sequence.index(blarg)

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

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

var_str = str()
var_int = int()

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

var = object()

这个哨兵是由建议的 尼克·科格兰.

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top