Время жизни локальной переменной в Python, если ее ссылка была скопированаPython

Программы на Python
Ответить
Anonymous
 Время жизни локальной переменной в Python, если ее ссылка была скопирована

Сообщение Anonymous »

Я провел небольшой эксперимент по доступу и использованию локальной переменной функции
на уровне вызывающего объекта, сохранив ссылку на локальную переменную в переменную, определенную на уровне вызывающего объекта, вместо использования оператора 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]
Это также будет легальным способом использования локальных переменных функций?

Подробнее здесь: https://stackoverflow.com/questions/793 ... was-copied
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»