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

var

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

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

value

for index in sequence:

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

相关问题

为什么函数可以修改调用者感知到的一些参数,而不能修改其他参数? Python变量声明

另请参阅

Python名称和值 其他语言有“变量”


当前回答

我不知道你想干什么。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,则项目被解除绑定。

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

for item in sequence:
    if some_condition(item):
       do_something(item)
       break

Or

found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)

其他回答

为什么不这样做呢:

var = None

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

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

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

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

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

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

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

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

显然,在这个例子中,你可以根据你想要实现的目标,将提升值替换为返回值None。

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

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

    return matches

还有另一种计算收益率的方法我就不给你们看了,因为它的工作方式很复杂。

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

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

我衷心建议你阅读其他语言有“变量”(我添加了一个相关链接)-在两分钟内你会知道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"

从如此短的代码示例中判断这是否是正确的风格有点困难,但它是一种更“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,则项目被解除绑定。

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

for item in sequence:
    if some_condition(item):
       do_something(item)
       break

Or

found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)
var_str = str()
var_int = int()