为什么这个密码错了?
D不是全局变量吗?
import pandas as pd
D = pd.DataFrame()
D['z'] = [2]
def funz2(z):
d = pd.DataFrame()
d['z'] = z
D = D.append(d)
print(D)
print(funz2(4))
这是错误信息
In [22]: ---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-22-68bb930462f5> in <module>()
----> 1 __pyfile = open('''/tmp/py3865JSV''');exec(compile(__pyfile.read(), '''/home/donbeo/Desktop/prova.py''', 'exec'));__pyfile.close()
/home/donbeo/Desktop/prova.py in <module>()
14
15
---> 16 print(funz2(4))
/home/donbeo/Desktop/prova.py in funz2(z)
10 d = pd.DataFrame()
11 d['z'] = z
---> 12 D = D.append(d)
13 print(D)
14
UnboundLocalError: local variable 'D' referenced before assignment
编辑: 如果变量不是自动全局的。 为什么有效?
x = 3
def funz(z):
return z * x
print(funz(4))
默认情况下,Python变量在作用域中不是全局的。这是设计出来的:如果一个函数可以改变函数外部定义的变量,那将是危险的。这里有一个更雄辩的解释:Using global variables in a function other than the one that created them
如果要在函数中向D追加行,可以将其声明为全局:
当读取变量时,Python首先在它的本地作用域中查找,如果找不到它的名称,它将开始在包含的作用域中查找。
您的
funz2
当然可以访问您在其外部声明的D
变量。您看到的问题是,您已经用以
D=
开头的行声明了D
函数的另一个funz
局部变量。这个本地的优先于另一个全球化的,因此你得到了例外。你能做的就是像Alex Woolford建议的那样,在funz函数中将
D
声明为global,使用的global语句实际上是这样说的:“看那儿的D,我不想在那儿声明本地的D变量,我希望它引用另一个global变量。”。相关问题 更多 >
编程相关推荐