Python:主程序中的变量传递给子函数

时间:2017-07-27 20:28:52

标签: python

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)

3 个答案:

答案 0 :(得分:3)

  

仅在函数内引用的变量是隐式的   全球。如果为变量赋值,则在其中的任何位置赋值   函数的主体,除非明确声明,否则它被假定为局部   作为全球性的。

来自:https://docs.python.org/3/faq/programming.html

答案 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继承了bc,定义于"顶级" (即fun1的封闭范围),然后将其进一步传递给嵌套的'函数fun2

fun2(其封闭范围为fun1)然后继承a中定义的fun1,以及bc,因为这是fun1继承的。

具体而言,请注意a内的fun24,而不是全球1(此处的其他答案似乎表明了这一点)。

如果您只在顶层定义了一个功能,那么您可以从概念上将其视为“嵌套”功能。在顶层,因此继承了在顶层定义的变量(即有效的全局范围,即使没有通过global关键字明确定义)。

有关详细信息,请查看help("NAMESPACES")

1.要清楚,我并不是说你可以暂时使用继承的值,并突然在中途定义一个本地版本;如果你这样做,python会抱怨你试图在分配之前使用局部变量"。我只是意味着您要么使用继承版本,要么显式重新定义它,这有效地使它成为在该函数中使用的同名的局部变量。

答案 2 :(得分:-2)

编辑:Pythons全局变量访问不像其他语言那样严格执行。见this Answer。 同样,python的封装也与其他语言不同。请参阅thisthis Answer