我做了一些实验来访问和使用函数的局部变量 在调用者级别,通过将局部变量的引用保存到在调用者级别定义的变量中,而不是使用 return 语句。 我还在类的成员函数中检查了这种情况。 而且我的经验是,即使我在这两种情况下显式删除了函数中的局部变量,局部变量的内存空间仍然有效。 我的目标是在类的成员函数中以及函数结束之前使用简单的局部变量,将一些局部变量的引用保存到更高级别的变量中,以避免大量的“self”。源代码中的文本。
cat b.py
b=[0,0]
print('\nIn function:')
def f():
global b
x=[i for i in range(10)] # here may be a lots of statements to compute x var
b=x # end of the above I save the reference of local x var in global var b
print('f1: b, id(b), id(x) ==', b, id(b), id(x))
del x # deleting local var
print('f2: b, id(b) ==', b, id(b))
print('m1: b, id(b) ==', b, id(b))
f()
print('m2: b, id(b) ==', b, id(b))
print('\nIn class:')
class c1:
def f(s, n):
# ----here is a lots of statements to compute x var ---
x=n
# -------------
s.y=x # end of the above I save the reference of local x var in object var y
print('c1: id(x), id(s.y) ==', id(x), id(s.y))
del x # deleting local var
print('c2: id(s.y) ==', id(s.y))
o=c1()
o.f([1,2,3])
print('m3: id(o.y), o.y ==', id(o.y), o.y)
>>> exec(open('b.py').read())
In function:
m1: b, id(b) == [0, 0] 140281480270856
f1: b, id(b), id(x) == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 140281547613640 140281547613640
f2: b, id(b) == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 140281547613640
m2: b, id(b) == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 140281547613640
In class:
c1: id(x), id(s.y) == 140281480270344 140281480270344
c2: id(s.y) == 140281480270344
m3: id(o.y), o.y == 140281480270344 [1, 2, 3]
这也是使用函数局部变量的合法方式吗?
所有对象都在同一个“全局”堆上创建,可供当前进程中的任何模块使用。对象一直存在,直到不存在对该对象的引用为止。如果没有 b = x
,列表
[i for i in range(10)]
将无法在调用 f
时保留下来,因为当 x
返回时,对它的每个引用 (f
) 都会超出范围。但是 b = x
在全局范围内放置了对列表的引用,不受 f
返回的影响。