在 Python 中是否可以仅声明变量而不分配任何值?

2025-04-15 09:20:00
admin
原创
33
摘要:问题描述:是否可以像这样在 Python 中声明变量?:var 所以它初始化为 None 了?Python 似乎允许这样做,但只要访问它就会崩溃。这可能吗?如果不行,为什么?编辑:我想针对这样的情况这样做:value for index in sequence: if value == None a...

问题描述:

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

var

所以它初始化为 None 了?Python 似乎允许这样做,但只要访问它就会崩溃。这可能吗?如果不行,为什么?

编辑:我想针对这样的情况这样做:

value

for index in sequence:

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

相关问题

  • 为什么函数可以修改调用者所感知的一些参数,但不能修改其他参数?

  • Python 变量声明

参见

  • Python 名称和值

  • 其他语言有“变量”


解决方案 1:

为什么不这样做呢:

var = None

Python 是动态的,所以你不需要声明任何变量;它们会在被赋值的第一个作用域内自动存在。所以,你只需要像上面那样使用一个常规的赋值语句。

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

解决方案 2:

在 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、linters 等第三方工具使用。

解决方案 3:

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

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

解决方案 4:

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

解决方案 5:

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

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

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

解决方案 6:

我知道它来得晚了,但是使用 python3,你可以使用以下命令声明未初始化的值

uninitialized_value:str

# some code logic

uninitialized_value = "Value"

但要非常小心地使用这个技巧,因为

uninitialized_value:str

# some code logic

# WILL NOT WORK
uninitialized_value += "Extra value
"

解决方案 7:

我通常将变量初始化为表示类型的值,例如

var = ""

或者

var = 0

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

var = Var()

解决方案 8:

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

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

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

但进一步说,您给出的代码示例有各种排列组合,非常符合 Python 风格。您正在寻找一种扫描序列中符合条件的元素的方法,因此这里有一些解决方案:

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

解决方案 9:

如果我理解你的例子没有问题,你根本不需要在 if 语句中引用“value”。只要它可以被设置为任意值,你就会立即跳出循环。

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

解决方案 10:

如果None是有效的数据值,则需要以其他方式访问变量。您可以使用:

var = object()

这个哨兵是Nick Coghlan建议的。

解决方案 11:

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

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

解决方案 12:

你看起来像是在用 Python 写 C 语言。如果你想在序列中查找某个东西,Python 有一些内置函数可以做到,比如

value = sequence.index(blarg)

解决方案 13:

var_str = str()
var_int = int()

解决方案 14:

你可以用这个丑陋的单行代码欺骗解释器,if None: var = None
它除了向局部变量字典添加一个变量之外什么也不做var,而不是初始化它。如果你之后尝试在函数中使用此变量,解释器会抛出 UnboundLocalError 异常。这在非常老的 Python 版本中也有效。虽然不够简洁,也不够美观,但不要对 Python 抱有太高的期望。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用