是否可以像这样在 Python 中声明一个变量?:
var
使其初始化为无?似乎 Python 允许这样做,但是一旦您访问它,它就会崩溃。这可能吗?如果不是,为什么?
编辑:我想在这样的情况下这样做:
value
for index in sequence:
if value == None and conditionMet:
value = index
break
相关问题
为什么函数可以修改调用者感知的某些参数,而不能修改其他参数?
Python 变量声明
也可以看看
Python 名称和值
其他语言有“变量”
为什么不这样做:
var = None
Python是动态的,所以你不需要声明东西;它们自动存在于分配它们的第一个范围内。因此,您所需要的只是上面的常规旧赋值语句。
这很好,因为你永远不会得到一个未初始化的变量。但是要小心——这并不意味着你不会得到不正确初始化的变量。如果您为 None
初始化某些内容,请确保这是您真正想要的,并尽可能分配更有意义的内容。
在 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 中分配任何值?”
注意:Python 运行时不强制执行函数和变量类型注释。它们可以被第三方工具使用,例如类型检查器、IDE、linter 等。
captain
将导致与其他情况下相同的 NameError
。另一方面,代码也没有对可以分配的内容施加任何限制。 captain: str
之类的代码虽然在 3.6 及更高版本中有效,但在 Python 本身中无效;它仅可能被第三方类型检查工具使用。
我衷心建议您阅读 Other languages have "variables"(我将其添加为相关链接)——在两分钟内您就会知道 Python 有“名称”,而不是“变量”。
val = None
# ...
if val is None:
val = any_object
val = val or any_object
来初始化它。
is
测试值是否为 None
。
我不确定你想做什么。 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)
好吧,如果你想检查一个变量是否被定义,那么为什么不检查它是否在 locals() 或 globals() 数组中呢?您的代码重写:
for index in sequence:
if 'value' not in globals() and conditionMet:
value = index
break
如果它是您要查找的局部变量,则将 globals() 替换为 locals()。
我通常将变量初始化为表示类型的东西
var = ""
或者
var = 0
如果它将成为一个对象,那么在实例化它之前不要初始化它:
var = Var()
首先,我对您最初提出的问题的回答
问:如何发现变量是否在我的代码中的某个点定义?
答:在源文件中阅读,直到看到定义该变量的行。
但更进一步,您已经给出了一个代码示例,其中有各种非常 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
覆盖。
它与没有赋值的定义不同。我仍在试图弄清楚如何绕过这个问题。
是否可以在 Python 中声明一个变量(var=None):
def decl_var(var=None):
if var is None:
var = []
var.append(1)
return var
我知道它来晚了,但使用 python3,你可以通过使用声明一个未初始化的值
uninitialized_value:str
# some code logic
uninitialized_value = "Value"
但是要非常小心这个技巧,因为
uninitialized_value:str
# some code logic
# WILL NOT WORK
uninitialized_value += "Extra value\n"
var_str = str()
var_int = int()
你可以用这个丑陋的 oneliner if None: var = None
来欺骗解释器,它除了将变量 var
添加到局部变量字典之外,什么都不做,而不是初始化它。如果您之后尝试在函数中使用此变量,解释器将抛出 UnboundLocalError 异常。这也适用于非常古老的 python 版本。不简单,也不漂亮,但不要对 python 期望太多。
不定期副业成功案例分享