Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用块手动实现会产生不同的结果_Python_Tensorflow_Contextmanager - Fatal编程技术网

Python 使用块手动实现会产生不同的结果

Python 使用块手动实现会产生不同的结果,python,tensorflow,contextmanager,Python,Tensorflow,Contextmanager,假设我写信 with some_method() ... 我的印象是,with命令首先调用\uuuuu enter\uuuuu()方法,处理some\u方法()返回的任何内容。(我相信somemethod()返回的东西被称为“上下文管理器”,也就是说它有名为\uuuuuuuuuuuuuu()和\uuuuuuuuuuu()的方法) 我试着手动调用\uuuuu enter\uuuu(),结果得到了与预期不同的结果。这个具体的例子是在TensorFlow的上下文中出现的,但我很确定它与Ten

假设我写信

with some_method()
    ...
我的印象是,
with
命令首先调用
\uuuuu enter\uuuuu()
方法,处理
some\u方法()返回的任何内容。(我相信
somemethod()
返回的东西被称为“上下文管理器”,也就是说它有名为
\uuuuuuuuuuuuuu()
\uuuuuuuuuuu()
的方法)

我试着手动调用
\uuuuu enter\uuuu()
,结果得到了与预期不同的结果。这个具体的例子是在TensorFlow的上下文中出现的,但我很确定它与TensorFlow本身没有任何关系

import tensorflow as tf
x = tf.Session()
x.as_default().__enter__()
print(tf.get_default_session()) 
打印
None
,以及

import tensorflow as tf
tf.Session().as_default().__enter__()
print(tf.get_default_session()) 
打印
,但

import tensorflow as tf
with tf.Session().as_default():
    print(tf.get_default_session()) 
打印


我已经发布了基本相同的问题,但我犯了错误,编辑了太多次,直到最后它没有问它开始问什么。因此,我只是重新创建这个问题。

这可能是因为您放弃了上下文管理器。很少有上下文管理器被设计为在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
之后丢弃,而不调用
\uuuuuuuuuuuuuuuuuuuuuuuu。当垃圾被收集时,它们中的一些会自动调用等价的
\uuuuu exit\uuuu
,而另一些则会以奇怪的方式进行操作


在这种特殊情况下,我相信
tf.Session().as_default()
最终会委托给一个代理。垃圾回收时,底层生成器会自动调用其
close
方法,这与调用上下文管理器的
\uuuuuuuuuuuuu
方法非常相似。

这听起来可能与上下文管理器被回收有关。
with
语句保留了对上下文管理器的引用(或者至少是对其
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法的引用,该方法通常具有对上下文管理器的引用),但您将放弃它。尝试将
x.as_default()
保存到变量中。是的,许多上下文管理器都有一个
close
方法(或等效的私有对象),该方法在
\uu del\uuuuuuuu
以及
\uuuuu exit\uuuu>中调用。(这对于文件和许多其他上下文管理器来说是有意义的,有些人这样做,尽管仅仅通过与文件等进行类比是没有意义的。)你是对的,将
x.保存为默认值()
到一个变量修复了它。一般来说,“垃圾收集”什么时候发生在对象上?只是想更好地理解这里发生了什么。@EricAuld:在CPython中,通常是在清除对对象的最后一次引用时。一般来说,一个对象在一段时间后不再可到达,或者可能永远无法到达。