Python:函数内局部变量的生命周期(内存范围)

时间:2015-12-23 07:01:26

标签: python

some_dict
  1. 什么时候在内存中创建了字典some_dict? (第一次调用该函数?)

  2. 字典android:largeHeap="true"何时被销毁/取消分配? (当函数返回时?)

  3. 如果是这样,是否意味着每次调用函数时都会创建字典对象?

    1. 在学习/处理python时,我应该担心这些事吗?

      • 处理此类情况的最佳做法是什么?是否最好全局创建字典以避免每次调用函数时都创建和销毁字典?
    2. 我在哪里可以了解某种语言的详细信息?我试着查看文档,但找不到我要找的东西。

    3. 提前感谢您,如果您能回答上述所有4个问题,我们将不胜感激!

2 个答案:

答案 0 :(得分:11)

  1. 每次调用函数时,都会在内存中创建字典some_dict
  2. 当函数返回时,它会被释放。
  3. 每次调用函数时重新创建字典都非常昂贵,特别是如果字典很大的话。您可以在调用函数中创建字典(假设调用者本身只调用一次)并将其作为参数传递给函数some_function()
  4. 例如,考虑调用函数caller()(问题中为callee)的函数some_function(),如

    def caller():
        callee()
    

    根据您的使用案例,我们希望多次调用callee(),我们需要在callee()中重复使用相同的字典。让我们来看看正常的使用案例。

    1。字典在callee()中生成。这是你问题中的例子。

    def caller():
        for loop:    
            callee()
    
    def callee(dictionary):
        generate dictionary
        do something with dictionary
    

    在这种情况下,每次调用callee()时,都必须生成一个新字典。这是因为只要callee()返回,它的所有局部变量都会被释放。因此,您无法重复使用"不同callee() s之间的相同字典。

    2。字典在caller()中生成,并作为参数传递给callee()

    def caller():
        generate dictionary
        for loop:    
            callee(dictionary)
    
    def callee(dictionary):
        do something with dictionary
    

    在这种情况下,您将在caller()中生成一次字典,然后将其传递给每个callee()函数。因此,每次拨打callee()时,您都不需要重新生成字典。

    字典通过引用传递,因此每次调用callee()时都不会传递庞大的数据结构。我不打算深入讨论这个问题(你可以找到一个很好的解释here),但实质上,将字典作为参数传递给callee()可以忽略不计。< / p>

答案 1 :(得分:3)

  

字典some_dict何时被销毁/取消分配? (当。。。的时候   函数返回?)

首先,当您离开该范围时,会破坏所有局部变量。

例如,在您返回的函数中,您将失去对some_dict定义的变量的所有引用。因为您要返回a,如果您没有像a_var = some_function()那样a引用a_var,那么您将失去a。< / p>

  

字典some_dict何时在内存中创建? (第一次   该函数被调用?)

some_dict = {&#39;随机&#39;:&#39;值&#39;}#在这里为每个方法调用。

  

在学习/处理python时,我应该担心这些事吗?

是的,请查看以下示例

>>> dictionary = {1: 1, 2: 2}
>>> function()
>>> def function():
    dictionary = {1: 2, 2:1}
    print dictionary
>>> function()
{1: 2, 2: 1}
>>> dictionary
{1: 1, 2: 2}

这里你可能假设你正在重新分配字典但是python正在创建一个本地字典并且在你从函数返回后很快就会丢失

  

如何克服上述问题,使用全局它会告诉您正在尝试在函数外部引用对象定义。

>>> def function():
    global dictionary
    dictionary = {1: 2, 2:1}
    print dictionary
>>> function()
{1: 2, 2: 1}
>>> dictionary
{1: 2, 2: 1}
  

我在哪里可以了解某种语言的详细信息?我试过看了   文档但无法找到我要找的东西。

可能问题应该是how do I learn such details,操作简单,理解文档并重新阅读。