如果Python输入值未分配给变量,会发生什么?

时间:2016-05-12 05:36:17

标签: python input

只是想知道这一点。因此,有时程序员会将input()插入到代码块中,而不会将其值赋给任何东西,以使程序在继续之前等待输入。通常当它运行时,你只需按下输入而不输入任何东西来继续前进,但如果你输入什么怎么办?如果该字符串未分配给任何变量,该怎么办?事后是否有办法阅读其价值?

2 个答案:

答案 0 :(得分:2)

TL; DR:如果您没有立即指定input()的返回值,则会丢失。

我无法想象之后你想要如何检索它。

如果你有任何可调用的(因为所有的callable都有返回值,默认为None),请调用它并且不保存其返回值,因此无法再获取它。您有一次机会获取返回值,如果您错过了它,它就会消失。

返回在可调用内部创建,当然是使其运行的代码,并且将分配一些内存来保存该值。在可调用内部,有一个引用该值的变量名称(除非您直接返回某些内容,例如return "unicorns".upper()。在这种情况下,当然没有名称)。

但是在可赎回后,会发生什么?返回值仍然存在,可以在调用上下文中分配给变量名。引用可调用内部值的所有名称都已消失。现在,如果您没有将值分配给调用语句中的名称,则不再有引用它的名称。

这是什么意思?它会进入垃圾收集器的命中列表,并在下一个垃圾收集周期中从你的内存中获取。当然,对于不同的Python解释器,GC实现可能会有所不同,但标准的CPython实现使用引用计数。

总而言之:如果你没有在你的通话声明中为返回值指定一个名字,那么你的程序就会消失,它将被销毁,它所声称的内存将被释放GC之后的任何时候,只要GC在后台处理它。

当然,一个callable可能会在它最终返回并退出之前使用该值执行其他操作。有几种可能的方法可以保留一个值:

  • 将其写入现有的global变量

  • 通过任何输出方法编写,例如将其存储在文件中

  • 如果它是对象的实例方法,它也可以将其写入对象的实例变量。

但是为了什么?除非存储最后一个返回值有任何好处,为什么要实现不必要地占用内存呢?

在某些情况下缓存返回值是有意义的,即对于具有可确定返回值的函数(意味着相同的输入始终导致相同的输出),这些函数通常使用相同的参数调用并需要很长时间才能计算。

但对于input函数?它可能是现有的最不可确定的函数,即使您调用random.random(),您可以比请求用户输入时更确定结果。缓存在这里完全没有意义。

答案 1 :(得分:0)

该值被丢弃。你无法取回它。就像你只有2 + 2random.rand()这样的行一样;结果消失了。