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
您没有定义那些您打算使用的变量,或者您将它们留在该范围内未定义。首先,在第一个片段中,您已经定义了两次相同的函数,这绝不是一个好主意。在第一个定义中,只有在语句if "dg" in a:
的计算结果为True时才定义r。因此,如果这是False,我会得到一个错误(我建议在if语句之前为r设置一个占位符值)。
在第二个代码片段中,您可以在一个函数中定义两个变量,然后尝试在函数外部访问它们。这些变量只在函数范围内定义(在大多数语言中,包括python,函数中定义的变量对于该函数是局部的,并且不能在其外部访问),因此您必须将它们设置为该函数或使它们成为全局变量。
我打算按照这种方式设计“IF”声明。谢谢,我现在看到剩下的就是范围。 – Minyae
没问题。如果你不介意upvoting和/或接受,我会不胜感激 –
你在哪里_清晰定义'r'(当调用'print(r)')时?在那个时候,你的'r'在一个函数内部('see()',它将保持在那里,因为它没有被声明为全局函数),所以当Python不知道你想要它打印什么时,它会抱怨。 – zwer
了解一些关于_variable scopes_,它们存在和不存在的地方。另请注意,如果您定义了一个函数,它将在您实际调用它之前不会运行。随机从互联网上击中:https://www.smallsurething.com/how-variable-scope-works-in-python/(虽然我没有详细阅读它,它似乎很有用)。 – tevemadar
谢谢,现在我看到它都是关于范围。我会研究它。 – Minyae