Python新手问题,在下面的代码中,batch_size如何传递给子函数eval_on_data?它是全局变量吗?
epochs = 10
batch_size = 128
def eval_on_data(X, y, sess):
total_acc = 0
total_loss = 0
for offset in range(0, X.shape[0], batch_size):
end = offset + batch_size
X_batch = X[offset:end]
y_batch = y[offset:end]
loss, acc = sess.run([loss_op, accuracy_op], feed_dict={features: X_batch, labels: y_batch})
total_loss += (loss * X_batch.shape[0])
total_acc += (acc * X_batch.shape[0])
return total_loss/X.shape[0], total_acc/X.shape[0]
...
val_loss, val_acc = eval_on_data(X_val, y_val, sess)
答案 0 :(得分:3)
仅在函数内引用的变量是隐式的 全球。如果为变量赋值,则在其中的任何位置赋值 函数的主体,除非明确声明,否则它被假定为局部 作为全球性的。
答案 1 :(得分:1)
请查看以下代码段作为解释:
a, b, c = 1, 2, 3
def fun1():
a = 4
def fun2():
b = 5
print a,b,c
fun2()
>>> fun1()
4 5 3
>>> print a,b,c
1 2 3
定义功能时,它会继承'来自调用范围的变量 显然,一旦在函数内局部重新定义该变量,则本地定义适用于函数的余数 1 。
这就是为什么fun1
继承了b
和c
,定义于"顶级" (即fun1
的封闭范围),然后将其进一步传递给嵌套的'函数fun2
。
fun2
(其封闭范围为fun1
)然后继承a
中定义的fun1
,以及b
和c
,因为这是fun1
继承的。
具体而言,请注意a
内的fun2
为4
,而不是全球1
(此处的其他答案似乎表明了这一点)。
如果您只在顶层定义了一个功能,那么您可以从概念上将其视为“嵌套”功能。在顶层,因此继承了在顶层定义的变量(即有效的全局范围,即使没有通过global关键字明确定义)。
有关详细信息,请查看help("NAMESPACES")
1.要清楚,我并不是说你可以暂时使用继承的值,并突然在中途定义一个本地版本;如果你这样做,python会抱怨你试图在分配之前使用局部变量"。我只是意味着您要么使用继承版本,要么显式重新定义它,这有效地使它成为在该函数中使用的同名的局部变量。
答案 2 :(得分:-2)
编辑:Pythons全局变量访问不像其他语言那样严格执行。见this Answer。 同样,python的封装也与其他语言不同。请参阅this或this Answer