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

标签 python

def some_function():
    some_dict = {'random': 'values'}
    a = some_dict['random']
    return a
  1. 字典some_dict是什么时候在内存中创建的? (第一次调用函数?)

  2. 字典 some_dict 何时销毁/解除分配? (函数什么时候返回?)

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

  1. 在学习/处理python的时候需要担心这些事情吗?

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

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

最佳答案

  1. 每次调用函数时,都会在内存中创建字典 some_dict
  2. 函数返回时释放。
  3. 每次调用函数时都重新创建字典确实很昂贵,尤其是在字典很大的情况下。您可以改为在调用者函数中创建字典(假设调用者本身只被调用一次)并将其作为参数传递给函数 some_function()

例如,考虑函数 caller() 调用函数 callee (some_function() 在你的问题),如

def caller():
    callee()

从你的用例来看,我们要多次调用callee(),我们需要在callee()中复用同一个字典。让我们来看看正常的使用案例。

1.字典在callee()中生成。这是您问题中的示例。

def caller():
    for loop:    
        callee()

def callee():
    generate dictionary
    do something with dictionary

在这种情况下,每次调用 callee() 时,您都必须生成一个新字典。这是因为一旦 callee() 返回,它的所有局部变量都会被释放。因此,您不能在不同的 callee() 之间“重用”同一个字典。

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

def caller():
    generate dictionary
    for loop:    
        callee(dictionary)

def callee(dictionary):
    do something with dictionary

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

字典是通过引用传递的,因此每次调用 callee() 时都不会传递庞大的数据结构。我不会对此进行深入讨论(您可以找到一个很好的解释 here),但本质上,将字典作为参数传递给 callee() 的成本可以忽略不计。

关于python - 函数内局部变量的生命周期(内存范围),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34430314/

相关文章:

python - Mask-RCNN with Keras : Tried to convert 'shape' to a tensor and failed. 错误:不支持无值

python - 如何使用 np.sort() 对数组进行排序

Python 如何从字典中获取所有值同名键

python - 将数据从 LabView 发送到 Python 并返回

python - 卸载带有 "pip"的包是否也会删除依赖包?

Python:当我调用 "Sub"时,它不会到达

python - 用 Python 复制 SAS 的第一个和最后一个功能

javascript - 仅在实际使用 cookie 时显示 cookie 通知

python - boost mpi python : undefined symbol: _ZN5boost3mpi5timer14time_is_globalEv

python - Polars 从日期时间对象中添加/减去 UTC 偏移量