Функция Python, вызывающая переменную из другой функции. Но почему? - PullRequest
0 голосов
/ 17 января 2019

Я знаю, что этот довольно дублируется:

def func1():
    a = [1,2,3,4,5]
    return a

def func2():
    b = func1()
    print(b.a[0])

func2()

AttributeError: 'list' object has no attribute 'a'

Я ХОЧУ использовать '.' точечную функцию (синтаксис) для доступа к переменным, объявленным в других функциях, таких как:

print(b.a[0])
or
print(b.a)

должен распечатать:

1
or
[1,2,3,4,5]

Разве это не сделает все намного проще?

И я знаю, что это можно сделать с помощью class или многими другими способами.

Но почему это не сработает?Есть ли какие-либо «обязательные» причины для такого способа доступа?Это сделает Python уязвимым?или это сделает Python нестабильным?

Мне не удалось найти идеальное, краткое, ясное и точное объяснение этой проблемы доступа.

Большое спасибо.


, чтобы быть более точным для@ Гойо

def func():
    a = [1,2,3,4,5]

def func2():
    b = func()
    b.a[0] = "Not Working"
    print(b)

func2()

или

def func3():
    from . import func
    b = func()
    b.a[0] = 'Not working either'
    print(b)

func3()

Я просто чувствую, что это более инстинктивный способ написания кодов.Может быть, это только я.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Функция (в вашем случае процедура, поскольку она ничего не возвращает) - это обработка данных, а не держатель данных, такой как объект или структура. Когда вы пишете b = func (), вы ожидаете получить результат func (). Вам не нужно знать, что происходит в func. a в вашей функции - внутренняя переменная, которая может быть собрана сборщиком мусора в конце функции (никто не ссылается на нее)

0 голосов
/ 17 января 2019

Вы ошибаетесь class variables с functions variables </p> <pre># This a Class class MyFunctions(): def __init__(self): pass # This is a function of the class def func1(): a = [1, 2, 3, 4, 5] return a # This is a Procedure, it is not function because it returns Nothing or None def func2(): b = MyFunctions.func1() print(b[0]) # a variable of the class MyFunctions.func1.a = 3 f = MyFunctions.func1.a print(f) func2()

0 голосов
/ 17 января 2019

Это потому, что вы не сказали return в функции func1, поэтому вы должны сделать:

def func1():
    a = [1,2,3,4,5]
    return a

def func2():
    b = func1()
    print(b[0])
...