Pandas全球数据框架

2024-05-19 14:31:24 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么这个密码错了?

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))

Tags: inpydataframehomedefpdmoduleprint
2条回答

默认情况下,Python变量在作用域中不是全局的。这是设计出来的:如果一个函数可以改变函数外部定义的变量,那将是危险的。这里有一个更雄辩的解释:Using global variables in a function other than the one that created them

如果要在函数中向D追加行,可以将其声明为全局:

global D = pd.DataFrame()

当读取变量时,Python首先在它的本地作用域中查找,如果找不到它的名称,它将开始在包含的作用域中查找。

您的funz2当然可以访问您在其外部声明的D变量。

您看到的问题是,您已经用以D=开头的行声明了D函数的另一个funz局部变量。这个本地的优先于另一个全球化的,因此你得到了例外。

你能做的就是像Alex Woolford建议的那样,在funz函数中将D声明为global,使用的global语句实际上是这样说的:“看那儿的D,我不想在那儿声明本地的D变量,我希望它引用另一个global变量。”。

相关问题 更多 >