1

python中是否有某种方法可以手动释放为字符串分配的内存,而其他一些变量仍然引用它?我想释放一个传递给函数内部函数的字符串。

def use_string(s):
  do_something_with_s(s)
  #can I free memory used for s here?
  do_other_things_that_dont_need_s()

my_string = "hi there."*100000
use_string(my_string)
do_some_other_things_that_dont_need_my_string()

据我了解, s (在 use_string 的上下文中)和 my_string 都将引用相同的不可变字符串对象,只有在没有变量指向它时才能释放该对象。这是真的吗?

4

5 回答 5

3

是的,这就是del关键字的用途。在垃圾收集语言中这样做是否真的有意义是另一回事。

于 2013-05-03T15:03:58.283 回答
2

在函数中使用del s将删除该范围内的引用。

如果它是对字符串对象的最后一个引用,那么它可能会被释放。(在此处的示例中,它不会,因为全局my_string仍然引用它。)

于 2013-05-03T15:04:20.087 回答
1

鉴于您的示例,您可以

my_string = "hi there."*100000
use_string(my_string)
del my_string

这允许垃圾收集器释放最初分配给的内存my_string,或者

use_string( "hi there." * 100000 )

在这种情况下,对字符串的唯一引用是函数局部变量,一旦函数返回,内存将被释放。

在任何情况下,您都不应该(即使您能够)释放函数内部的内存,因为您不知道其他代码是否持有对该内存的引用并可能会尝试使用它。

于 2013-05-03T15:30:04.587 回答
1

是的。当没有更多的引用时,Python 的垃圾收集器将释放内存。

如果您想了解更多详细信息:http ://www.digi.com/wiki/developer/index.php/Python_Garbage_Collection

于 2013-05-03T15:04:26.540 回答
0

由于 Python 对象是作为值传递的引用传递的(即不能更改引用,但可以更改被引用对象的内容,除非该对象是不可变的),因此不能更改调用者直接传递给函数的引用从函数内部。

如果您需要更改/释放字符串,则需要将其包装在一个类中,以便您可以更改对对象内部字符串的唯一引用。我建议在像这样混淆代码之前深呼吸,但是当你真的需要它时,你真的需要它。

此示例仅旨在以最少的代码显示概念,而不是显示如何以漂亮的方式进行操作:)

def use_string(wrap):
  print wrap.s           # Prints 'olle'
  wrap.s = None          # Resets the reference
  print wrap.s           # Prints 'None'

class wrapper(object):
  pass

a = wrapper()
a.s = "olle"
print a.s                # Prints 'olle'
use_string(a)
print a.s                # Prints 'None'
于 2013-05-03T15:17:48.663 回答