在Python中,我如何检查变量是否存在?

4
如果“x”存在,则打印“x存在”。
我之所以这样问,是因为我经常会遇到这个错误:
UnboundLocalError at /settings/
local variable 'avatarlink' referenced before assignment

2
再次强调:一般情况下,不要使用locals()globals(),也不要捕获UnboundLocalError,而是应该修复你的代码。请阅读答案中提供的有关Python作用域、命名空间、命名和绑定的链接:https://dev59.com/OHRB5IYBdhLWcg3wl4Sc#575337 - jfs
3
如果你总是遇到这个错误,那么你的设计有问题。你不需要为一个变量进行“测试”,你需要修复你的设计。为什么你“总是”会遇到这个错误?你犯了哪个设计错误? - S.Lott
如何在Python中检查变量是否存在的标题与此标题几乎相同。这两个问题有什么不同之处吗? - Anderson Green
5个回答

9

为什么需要知道呢?如果代码因此而崩溃,那很可能是因为代码本身就有问题,需要修复。

话虽如此,建议检查if 'x' in locals()或者if 'x' in globals(),根据你期望的位置选择相应的检查方法。


2
只是为了澄清,您需要引用名称('avatarlink' in locals())。但第一段才是真正的解决方案。+1 - user395760
3
虽然这确实是您问题的正确答案,但请考虑卡尔的评论,如果您需要使用这样的检查,则您的代码可能已经出了问题。您目前是在处理症状,而不是原因,这总是一个不好的想法。 - Jim Brissom
@martineau,我熟悉EAFP,但那似乎是该原则的一种极端应用 :) - Karl Knechtel
@S.Lott:代码已经修复...但你正在点赞和引用谁/什么?一些被删除的评论吗? - martineau
@S.Lott:可以对评论和答案进行点赞。我之所以提出这个问题,是因为我没有在答案中看到你引用的那些单词,可能是由于我的浏览器分行方式不同导致的 - 所以我不知道正在引用哪些代码。对于造成的困惑,我很抱歉,谢谢你最终告诉我我想知道的内容。 - martineau
显示剩余6条评论

7
正如Python所说,“宁愿请求原谅,也不要征得许可”。因此,只需尝试访问变量,并在变量不存在时捕获错误即可。
try:
    x
    print "x exists"
except UnboundLocalError:
    print "x doesn't exist"

不过,我非常想知道为什么你认为需要这样做。通常,在检查变量值之前,你会先设置变量。


UnboundLocalErrorNameError 的子类型。它只会在编译时确定 x 为局部变量,但尚未被分配时引发。这只能在函数内部发生,并且仅在函数的其他位置有对该名称的赋值 没有相应的 globalnonlocal 声明时才会发生。否则,将导致通用的 NameError - Karl Knechtel

2
try:
  variable
except NameError:
  print "It doesn't Exist!"
else:
  print "It exists!"

1

你可以检查 x 是否在 globals() 或者 locals() 中。


1
在Python中,您真的不应该使用未设置的变量。如果需要,您可以将avatarLink设置为None。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接