如何检查一个变量是否存在?

1379 投票
16 回答
1760587 浏览
提问于 2025-04-15 11:28

我想检查一个变量是否存在。现在我正在这样做:

try:
    myVar
except NameError:
    # Do something.

有没有其他方法可以做到这一点,而不需要用到异常处理?

16 个回答

93

一种简单的方法是一开始就把它初始化为 myVar = None

然后在后面的代码中:

if myVar is not None:
    # Do something
185

使用那些还没有被定义或设置的变量(无论是隐式还是显式)通常是不好的,因为这往往意味着程序的逻辑没有经过充分的考虑,可能会导致不可预测的行为。

如果你在Python中确实需要这样做,可以使用下面这个小技巧,确保在使用变量之前,它有某个值:

try:
    myVar
except NameError:
    myVar = None      # or some other default value.

# Now you're free to use myVar without Python complaining.

你选择给它的值当然要根据你想要做的事情来决定。例如,如果这是某个累加器的起始值,你可以把它设为零。


不过(这是我的个人看法),最好还是重构你的代码,避免这种情况的发生。

举个例子,下面的代码在这个回答中被提到,用于从之前的点绘制到当前点:

if last:
    draw(last, current);
last = current

如果last没有被赋值,这在Python中是没用的,因为即使是检查last也会引发异常。更好的做法是确保last确实有一个值,这个值可以用来判断它是否有效。可以这样做:

last = None

# some time passes ...

if last is not None:
    draw(last, current);
last = current

这样可以确保变量存在,并且只有在它对你需要的事情有效时才使用它。

如果你无法控制变量的初始设置,仍然可以通过使用上面提到的异常处理方法来强制这样做:

# Variable 'last' may or may not be bound to a value at this point.

try:
    last
except NameError:
    last = None

# It will always now be bound to a value at this point.

if last is not None:
    draw(last, current);
last = current
2304

要检查一个本地变量是否存在:

if 'myVar' in locals():
  # myVar exists.

要检查一个全局变量是否存在:

if 'myVar' in globals():
  # myVar exists.

要检查一个对象是否有某个属性:

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.

撰写回答