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