Pandas全局数据框架

4

为什么这段代码出错了?

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))
2个回答

3

默认情况下,Python 变量的作用域不是全局的。这是有意设计的:如果函数能够更改在函数外定义的变量,那么会很危险。以下是更为娓娓道来的解释:在创建变量的函数之外的函数中使用全局变量

如果你想在你的函数中向 D 添加行,你可以将它声明为全局变量:

global D = pd.DataFrame()

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


3

你的funz2函数可以访问你在其外部声明的D变量。

问题出在你在funz函数内又声明了另一个局部变量D,并用以开始的那行代码进行了赋值。这个局部变量优先级高于其他全局变量,因此你会得到异常错误。

你可以像Alex Woolford建议的那样,在funz函数中使用global语句将D声明为全局变量,从而实际上说“看那里的D,我不想在那里声明任何局部D变量,我希望它引用其他全局变量”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接