在方法中动态定义局部变量的最佳方法是什么

2024-06-25 05:18:40 发布

您现在位置:Python中文网/ 问答频道 /正文

当我调用函数时,我希望能够在函数中定义动态变量名,比如。。。在

def build_ports(portlist):
    for idx, portname in enumerate(portlist):
        chassis, slot, port = portname.split('/') 
        vartxt = "p%i" % idx
        locals()[vartxt] = Port()  # Class defining a port object
        locals()[vartxt].port_method1(chassis, slot, port)
        if idx > 5:
            locals()[vartxt].port_method2()  # Only call this object method, if idx > 5

但是我们都知道locals()是只读的,不像{}。。。所以当解释器看到locals()[vartxt]时,它就会呕吐。。。在

有没有任何方法可以在不污染全局命名空间的情况下在方法中定义动态变量(或者更糟的是,在方法中使用全局变量,而在该方法中从未定义过它)?在


Tags: 方法函数if定义objectport动态slot
3条回答

这是不可能的。如果您研究一下Python是如何存储局部变量的,就可以知道原因了。在

全局变量存储在一个哈希表中,哈希表的大小是动态的,名称被编译成散列键(Python的说法是,内部字符串)。这使得全局查找相对“慢”,但由于需要从其他编译单元(模块)中按名称查找全局项,因此需要:

# a.py
x = 3

# b.py
import a
a.x = 4 # b needs to know how to find the same x!

局部变量存储在固定大小的数组中,名称被编译成数组索引。在

当您查看字节码时,可以看到这一点,对于本地用户,它具有LOAD_FAST和STORE_FAST,但是对于全局变量,它有LOAD_GLOBAL和STORE_GLOBAL。它也会在不同的异常中泄露。当找不到全局变量时,会出现一个NameError,但是未定义的局部变量会被一个空槽检测到,并给出一个UnboundLocalError。在

^{pr2}$

因为数组是固定大小的,并且大小是在编译函数时计算的,所以不能创建任何其他局部变量。在

如果需要更多的“局部变量”,则需要将值存储为对象的命名属性或字典中;显然,这也会抵消速度优势。在

使用列表而不是这种疯狂的变量。在

def build_ports(portlist)
    ports = []
    for idx, portname in enumerate(portlist):
        ports.append(Port())
        ports[-1].port_method1()
        if idx > 5:
            ports[-1].port_method2()

您可以不使用ports[-1],而是废弃未使用的portname迭代变量并创建一个局部portname = Port(),使用它来调用这些方法,然后在末尾将其附加到ports。到底什么是?在

签出exec。在

编辑:是的,我是说执行官。在

相关问题 更多 >