Python中的静态效应

-1 投票
2 回答
1437 浏览
提问于 2025-04-16 09:27

我们怎么能在Python中实现静态效果,而不使用类和全局变量呢?

不是像下面这样:

global a
a = []

#simple ex ;
fonk ( a , b , d) 

   x =  1 

   a.append ( x) 

编辑:
我想创建一个临时内存,如果我退出一个叫做fonk的函数,我希望把变化保存为一个列表在临时内存中。
我们可以通过在数据类型前面加上static关键字来实现这个需求,但在Python中没有static这个概念,所以我想在Python中实现类似的效果。那么,我该怎么做呢?

如上面的代码所示,“a”代表临时内存。

2 个回答

0

在全局范围或类范围内定义的属性实际上是静态的,因为模块被视为单例,而类定义在特定模块的全局范围内也是单例。(这个解释没有涉及Python的一些动态特性,这些特性可能会改变这种行为)

global关键字是在局部范围内使用的,用来明确赋值的意思。它的意思是这个属性名属于外层的全局范围。

在你的(有问题的)例子中,你甚至不需要使用global关键字,因为你并没有进行赋值,你只是调用了append()方法 - 不需要进行任何区分。

下面是一个关于global用途的示例:

>>> a = []
>>> def fonk():
...     a = [1]
...
>>> print a
[]
>>> fonk()
>>> print a
[]
>>>
>>> def fonk2():
...     global a
...     a = [2]
...
>>> print a
[]
>>> fonk2()
>>> print a
[2]

编辑:我想我没有理解问题的重点(不要通过global和类来实现),但我不明白反对的理由,尤其是当示例代码似乎有问题的时候。

2

函数参数的默认值只会在定义函数的时候计算一次,所以如果你把一个可变对象放在这里,它会在多次调用中保持不变。这可能会让人困惑,但在缓存和类似的场景中非常有用,这在其他语言中通常会用到 static。当然,调用者可以覆盖你的缓存,但这并不是坏事,除非他们有很好的理由,否则他们不会这样做,而在这种情况下,你应该允许他们这样做。

举个例子(这个例子通常出现在“注意事项”的问题中 ^^):

def append_and_return_static_list(item, items=[]):
    items.append(item)
    return items

append_and_return_static_list(0)
append_and_return_static_list(1)
print append_and_return_static_list(2) #=> [0,1,2]

现在,如果你绝对不想这样做,你还有其他选择:你可以在函数外创建一个变量,把你想共享的对象放在那里。如果你希望这个变量被认为是私有的,最好在名字前加一个下划线(这不是编译器强制的私有,而是一种约定和生存本能的约束)。

举个例子(这段代码不是最好的,前面的例子在几乎所有情况下都更好):

_items = []
def append_and_return_static_list(item):
    _items.append(item)
    return _items

append_and_return_static_list(0)
append_and_return_static_list(1)
print append_and_return_static_list(2) #=> [0,1,2]

撰写回答