为什么这段代码错了?
不是全球变量?
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))
答案 0 :(得分:3)
您的funz2
当然可以访问您在其外宣布的D
变量。
您看到的问题是因为您已使用以D
开头的行向funz
函数声明了另一个D=
变量。这个本地的优先于其他全局的,因此你得到了例外。
你可以做的是正如亚历克斯·伍尔福德所建议的那样,将funz函数中的D
声明为全局,使用全局语句实际上说'看到D在那里,我不想声明没有本地D var那里我希望它引用其他全局的那个'。
答案 1 :(得分:1)
默认情况下,Python变量的范围不是全局变量。这是设计的:如果函数可以改变函数外部定义的变量,那将是危险的。这是一个更有说服力的解释:Using global variables in a function other than the one that created them
如果要在函数中向行追加行,可以将其声明为全局:
global D = pd.DataFrame()
在读取变量时,Python首先查找其本地范围,如果找不到该名称,它将开始查看包含的范围。