Я провел небольшой эксперимент по доступу и использованию локальной переменной функции
на уровне вызывающего объекта, сохранив ссылку на локальную переменную в переменную, определенную на уровне вызывающего объекта, вместо использования оператора return.
Я также проверил этот случай в функции-члене класса.
И я обнаружил, что пространство памяти локальной переменной остается действительным, даже если я явно удалил локальную переменную в функции в обоих случаях.Моей целью было бы использовать простые локальные переменные в члене функции классов и перед завершением функции сохранить ссылки на некоторые локальные переменные в переменную на более высоком уровне, чтобы избежать большого количества «я». текст в исходном коде.
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]
Это также будет легальным способом использования локальных переменных функций?
Я провел небольшой эксперимент по доступу и использованию локальной переменной функции на уровне вызывающего объекта, сохранив ссылку на локальную переменную в переменную, определенную на уровне вызывающего объекта, вместо использования оператора return. Я также проверил этот случай в функции-члене класса. И я обнаружил, что пространство памяти локальной переменной остается действительным, даже если я явно удалил локальную переменную в функции в обоих случаях.Моей целью было бы использовать простые локальные переменные в члене функции классов и перед завершением функции сохранить ссылки на некоторые локальные переменные в переменную на более высоком уровне, чтобы избежать большого количества «я». текст в исходном коде. [code]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('\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))
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] [/code] Это также будет легальным способом использования локальных переменных функций?