我们如何在python上构造静态效果而不是使用class和global?
不喜欢那个:
global a
a = []
#simple ex ;
fonk ( a , b , d)
x = 1
a.append ( x)
编辑: 我想创建临时内存,如果我退出函数即fonk,我想将更改保存为临时内存列表。 我们可以这样做,只需要在数据类型前放置static关键字,但在python中,我们没有静态,所以我想在python中使用这个效果。因此,我该怎么办?
如上所述代码说“a”代表临时存储器
答案 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]
编辑:我想我错过了问题的重点(不要通过全局和类来做),但我不理解异议,特别是当示例代码似乎被破坏时