Python 3.6.1在我已经明确定义它之后说明了未定义的值/变量

问题描述:

第一个程序是按照我预期的步骤写的,并且工作正常。这是在完全立即定义它之后,它抛出了我在标题中描述的错误。在运行第二个之后,我确实运行了第一个,错误与我描述的一样。特别是在第一次第一次工作后,我强烈地感觉自己是对的。这是第一个Python 3.6.1在我已经明确定义它之后说明了未定义的值/变量

a = {"piz":12, "san":23, "dg":45} 

def see(a): 
    if "dg" in a: 
     r = a["dg"] 
    return r 
print (r) 

def see(r): 
    return r + 1 

print (see(r)) 

而这里的错误。

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib/python3.6/site-packages/spyder/util/site/sitecustomize.py", line 880, in runfileexecfile(filename, namespace) 
File "/usr/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 
File "/home/josh/python/viper.py", line 7, in <module> 
print (r) 
NameError: name 'r' is not defined 

第二个函数甚至是“crazier”,它创建一个变量“e”并且不会创建另一个“f”。

d = 3 
a = [1,2,3] 

b = [4,5,6] 

c = [7,8,9] 

#The function just checks if "d" is in "a", then creates variables "e" and "f" 
def enclosing(): 
    def abc(a, d): 
     if d in a: 
      print ("yes") 
      print (a[0]) 
    e = a[0] 
    f = a[1] 
    return 

    print (e) 
    print (f) 

和它的错误。

File "/usr/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 880, in runfile 
execfile(filename, namespace) 
File "/usr/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 
File "/home/josh/python/d.py", line 25, in <module> 
print (e) 

NameError: name 'e' is not defined 
+1

你在哪里_清晰定义'r'(当调用'print(r)')时?在那个时候,你的'r'在一个函数内部('see()',它将保持在那里,因为它没有被声明为全局函数),所以当Python不知道你想要它打印什么时,它会抱怨。 – zwer

+0

了解一些关于_variable scopes_,它们存在和不存在的地方。另请注意,如果您定义了一个函数,它将在您实际调用它之前不会运行。随机从互联网上击中:https://www.smallsurething.com/how-variable-scope-works-in-python/(虽然我没有详细阅读它,它似乎很有用)。 – tevemadar

+0

谢谢,现在我看到它都是关于范围。我会研究它。 – Minyae

您没有定义那些您打算使用的变量,或者您将它们留在该范围内未定义。首先,在第一个片段中,您已经定义了两次相同的函数,这绝不是一个好主意。在第一个定义中,只有在语句if "dg" in a:的计算结果为True时才定义r。因此,如果这是False,我会得到一个错误(我建议在if语句之前为r设置一个占位符值)。

在第二个代码片段中,您可以在一个函数中定义两个变量,然后尝试在函数外部访问它们。这些变量只在函数范围内定义(在大多数语言中,包括python,函数中定义的变量对于该函数是局部的,并且不能在其外部访问),因此您必须将它们设置为该函数或使它们成为全局变量。

+0

我打算按照这种方式设计“IF”声明。谢谢,我现在看到剩下的就是范围。 – Minyae

+0

没问题。如果你不介意upvoting和/或接受,我会不胜感激 –