以下代码在Python 2.5和3.0中按预期工作:
a, b, c = (1, 2, 3)
print(a, b, c)
def test():
print(a)
print(b)
print(c) # (A)
#c+=1 # (B)
test()
Run Code Online (Sandbox Code Playgroud)
但是,当我取消注释行(B)时,我得到了UnboundLocalError: 'c' not assigned一行(A).的值a和b被正确地打印.这让我感到困惑,原因有两个:
为什么在行(A)处抛出运行时错误,因为后面的行(B)语句?
为什么变量a和b打印符合预期,同时c引发错误?
我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于"全局"变量.当然,变量在存在之前"窃取"范围是没有意义的.cc+=1c
有人可以解释一下这种行为吗?
码:
import urllib2 as u
import os as o
inn = 'dword.txt'
w = open(inn)
z = w.readline()
b = w.readline()
c = w.readline()
x = w.readline()
m = w.readline()
def Dict(Let, Mod):
global str
inn = 'dword.txt'
den = 'definitions.txt'
print 'reading definitions...'
dell =open(den, 'w')
print 'getting source code...'
f = u.urlopen('http://dictionary.reference.com/browse/' + Let)
a = f.read(800)
print 'writing source code to file...'
f = open("dic1.txt", "w")
f.write(a)
f.close()
j = open('defs.txt', 'w')
print 'finding definition is source …Run Code Online (Sandbox Code Playgroud) a = 10
def f():
print(1)
print(a) # UnboundLocalError raised here
a = 20
f()
Run Code Online (Sandbox Code Playgroud)
这个代码当然会提升UnboundLocalError: local variable 'a' referenced before assignment.但是为什么在这print(a)条线上提出了这个例外?
如果解释器逐行执行代码(就像我认为的那样),它就不会知道print(a)到达时出了什么问题; 它只会认为是a指全局变量.
因此,解释器似乎提前读取整个函数以确定是否a用于赋值.这记录在哪里?还有其他任何解释器向前看的场合(除了检查语法错误)吗?
为了澄清,异常本身非常清楚:全局变量可以在没有global声明的情况下读取,但不能写入(这种设计可以防止由于无意中修改全局变量而导致的错误;这些错误特别难以调试,因为它们会导致错误发生在远离错误代码的位置).我只是好奇为什么早点提出异常.
根据python reference manual我们有
如果根本找不到名称,则会引发 NameError 异常。如果名称引用尚未绑定的局部变量,则会引发 UnboundLocalError 异常。UnboundLocalError 是 NameError 的子类。
我不明白什么时候UnboundLocalError抛出?因为
Python 缺少声明并允许名称绑定操作发生在代码块中的任何位置。
那么我们如何才能声明一个变量,而不去初始化她呢?
我还是keras和python的新手,我收到一个我似乎无法理解的错误.错误是:
Traceback (most recent call last):
File "/Users/N/PycharmProjects/hw2/hw2_1.py", line 35, in <module>
model.fit(trainingInp, trainingOut, epochs=10, batch_size=1)
File "/Library/Python/2.7/site-packages/keras/models.py", line 893, in fit
initial_epoch=initial_epoch)
File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 1555, in fit
batch_size=batch_size)
File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 1409, in _standardize_user_data
exception_prefix='input')
File "/Library/Python/2.7/site-packages/keras/engine/training.py", line 126, in _standardize_input_data
array = arrays[i]
UnboundLocalError: local variable 'arrays' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
它发生在model.fit()中.我的模型是这样的:
model = Sequential()
model.add(Dense(3, activation='sigmoid', input_dim=8))
model.add(Dropout(0.5))
model.add(Dense(10, activation='sigmoid'))
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])
print trainingInp
print trainingOut
model.fit(trainingInp, trainingOut, epochs=10, batch_size=1)
Run Code Online (Sandbox Code Playgroud)
我打印我的数据以确保我没有传入空数据,并且在进入model.fit()之前它正确打印.
我不太确定如何解决它,因为我不知道问题是什么.似乎问题是batch_size,但我认为允许批量大小为1.
以下是我获取数据的方式.我保证数据没有任何空值.
#read and categorize …Run Code Online (Sandbox Code Playgroud)