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

oxa*_*org 22 python

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

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

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

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

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

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

The*_*ion 14

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

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

def caller():
    callee()
Run Code Online (Sandbox Code Playgroud)

从您的使用案例中,我们想callee()多次调用,我们需要重用相同的字典callee().让我们来看看正常的使用案例.

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

def caller():
    for loop:    
        callee()

def callee(dictionary):
    generate dictionary
    do something with dictionary
Run Code Online (Sandbox Code Playgroud)

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

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

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

def callee(dictionary):
    do something with dictionary
Run Code Online (Sandbox Code Playgroud)

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

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