Python Free String传递给函数

时间:2013-05-03 15:01:48

标签: python function memory args

在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都将引用相同的不可变字符串对象,只有在没有变量指向它时才能释放它。这是真的吗?

5 个答案:

答案 0 :(得分:2)

是的,这就是del keyword的用途。 用垃圾收集语言实现这一点是否真的有意义是另一回事。

答案 1 :(得分:2)

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

如果它是对字符串对象的最后一个引用,则可以释放它。 (在这里的示例中,它不会,因为全局my_string仍然引用它。)

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

根据你的例子,你可以

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

允许垃圾收集器释放最初为my_string

分配的内存
use_string( "hi there." * 100000 )

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

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

答案 4 :(得分: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'