一直以為python中的with語句中的變量,只在with語句塊中起作用。不然為什么要縮進一個級別呢?
呵呵,然而並沒有為with語句內的變量創建新的作用域。
舉例:
# test.py
with open('test.txt', 'w') as fout:
a = 12
line = 'test line\n'
fout.write(line)
print('a=', a) #這里訪問了a變量,會報錯嗎?並不會。
執行上述代碼,發現最后一行的print語句並沒有報錯,因為with並沒有為a新創建作用域。
類似的寫法,出現在tensorflow eager入門教程的求導函數中:
def grad(model, inputs, targets):
with tf.GradientTape() as tape:
loss_value = loss(model, inputs, targets)
return tape.gradient(loss_value, model.variables) #這里使用到了tape