Python 3.x Python3.6.1在我清楚地定义了未定义的值/变量之后说它是未定义的

Python 3.x Python3.6.1在我清楚地定义了未定义的值/变量之后说它是未定义的,python-3.x,function,Python 3.x,Function,第一个程序是逐步编写的,并按照我的预期工作。这是在一次完整地定义它之后,它抛出了一个我在标题中描述的错误。在运行第二个之后,我确实运行了第一个,错误正如我所描述的。我从骨子里强烈地感觉到我是对的,尤其是在第一次工作之后。这是第一个 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

第一个程序是逐步编写的,并按照我的预期工作。这是在一次完整地定义它之后,它抛出了一个我在标题中描述的错误。在运行第二个之后,我确实运行了第一个,错误正如我所描述的。我从骨子里强烈地感觉到我是对的,尤其是在第一次工作之后。这是第一个

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
以及它的错误

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
运行文件中的第880行“
File”/usr/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py”
execfile(文件名、命名空间)
文件“/usr/lib/python3.6/site packages/spyder/utils/site/sitecustomize.py”,第102行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“/home/josh/python/d.py”,第25行,在
打印(e)
NameError:未定义名称“e”

您没有在想要定义的地方定义这些变量,或者在该范围内没有定义它们。首先,在第一个代码段中,您已经两次定义了相同的函数,这绝不是一个好主意。在第一个定义中,只有当a:中的“dg”计算结果为True时,才定义r。因此,如果该值为False,则会出现错误(我建议在if语句之前为r设置一个占位符值)


在第二个代码段中,您在一个函数中定义了两个变量,然后尝试在函数外部访问它们。这些变量仅在函数范围内定义(在大多数语言中,包括python,函数中定义的变量是该函数的本地变量,不能在函数范围外访问)因此,您必须将它们设置为函数的返回值,或者使它们成为全局变量。

您没有在您想要定义的地方定义这些变量,或者在该范围内未定义这些变量。首先,在第一个代码段中,您已经两次定义了相同的函数,这绝不是一个好主意。在第一个定义中,只有当a:中的“dg”计算结果为True时,才定义r。因此,如果该值为False,则会出现错误(我建议在if语句之前为r设置一个占位符值)


在第二个代码段中,您在一个函数中定义了两个变量,然后尝试在函数外部访问它们。这些变量仅在函数范围内定义(在大多数语言中,包括python,函数内定义的变量是该函数的本地变量,在函数外无法访问),因此您必须将它们设置为函数的返回值或使其成为全局变量。

您在哪里明确定义了
r
(当调用
print(r)
)时?此时,您的
r
位于函数内部(
请参见()
,它将保持在那里,因为它没有声明为全局)因此,当Python不知道要打印什么时,它当然会抱怨。了解一些变量作用域,它们存在和不存在的地方。还要注意,如果定义一个函数,它在实际调用它之前不会运行。来自internet的随机点击:(虽然我没有详细阅读,但它似乎很有用)。谢谢,现在我明白了这一切都是关于作用域的。我会研究一下。您在哪里清楚地定义了
r
(当调用
print(r)
)时)?此时,您的
r
位于函数内部(
see()
,并且它将保持在那里,因为它没有声明为全局)因此,当Python不知道要打印什么时,它当然会抱怨。了解一些变量作用域,它们存在和不存在的地方。还要注意,如果定义一个函数,它在实际调用它之前不会运行。来自internet的随机点击:(虽然我没有详细阅读,但它似乎很有用)。谢谢,现在我明白了,这都是关于范围的。我会调查一下。我本来打算按原样设计“如果”语句的。谢谢,我现在看到其余的都是关于范围的。没问题。如果你不介意投票和/或接受,我将非常感激我打算设计“如果”声明原样。谢谢,我知道剩下的都是关于范围的。没问题。如果你不介意投票和/或接受,我将不胜感激
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