对python的静态效果

时间:2011-01-05 16:24:08

标签: python list

我们如何在python上构造静态效果而不是使用class和global?

不喜欢那个:

global a
a = []

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

   x =  1 

   a.append ( x) 

编辑: 我想创建临时内存,如果我退出函数即fonk,我想将更改保存为临时内存列表。 我们可以这样做,只需要在数据类型前放置static关键字,但在python中,我们没有静态,所以我想在python中使用这个效果。因此,我该怎么办?

如上所述代码说“a”代表临时存储器

2 个答案:

答案 0 :(得分: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]

现在,如果你绝对不想这样做,你还有其他可能性:你可以在函数外部创建一个变量,然后将你想要分享的对象放在那里。如果你希望它被认为是私有的(不是编译器强制执行的私有,而是惯例和生存本能 - 强制执行),你应该在名称前加上一个下划线。(/ p>

示例(不是最好的代码,以上几乎在所有情况下都更好):

_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]

答案 1 :(得分:0)

在全局范围或类范围中定义的属性实际上是静态的,因为模块被视为单例,而扩展类定义是特定模块全局范围内的单例。 (这个解释掩盖了可以改变这种行为的Python的动态特性)

在本地范围内使用global关键字来消除指派的歧义。这是一个声明属性名称属于封闭的全局范围。

在你的(破碎)示例中,你甚至不需要使用global关键字,因为你没有使用赋值,你正在调用a的append()方法 - 不需要消除歧义。

全球用途的说明性示例:

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

编辑:我想我错过了问题的重点(不要通过全局和类来做),但我不理解异议,特别是当示例代码似乎被破坏时