2015-12-13 4 views
1

Я не могу сделать эту работу.Использование переменных внутри функции в другом файле python

У меня есть 2 питона файлов, позволяет говорить a.py и b.py

в a.py это:

def foo(): 
    global name 
    name = "foo" 
    import b 
    b.bar() 

if __name__ == "__main__": 
    foo() 

в b.py этом:

import a 

def bar(): 
    name = a.name 
    print(name) 

У меня есть три разных вопроса относительно этого кода:

  1. Почему я получаю сообщение об ошибке: AttributeError: 'module' object has no attribute 'name' Я точно знаю, что b.py не может получить доступ к переменной, определенной в функции в b.py, но как это решить?
  2. делает глобальный в этом случае что-то меняет? если нет, то почему?
  3. я пытался делать name = a.foo.name вместо name = a.name, но это не делает трюк либо и дает мне: AttributeError: 'function' object has no attribute 'name', это даже практически в любом случае и то, что я сделал не так?

Спасибо, что нашли время и жаль, если это кажется очевидным для некоторых из вас, я все еще попадаю в это.

+0

Где вы определяете 'имя' в' a.py'? – ozgur

+0

@ozgur да, это определено в функции foo() в переменных a.py – Lyux

+2

, определенных внутри функции, привязаны к локальной области действия функции, поэтому они не видны вне функции. Вам нужно определить 'имя' где-нибудь в a.py вне' foo() '. – ozgur

ответ

0

Сценарии не являются модулями. Это что-то вроде умы, но когда вы запустите python3 a.py, a.py не является модулем (или, вернее, его модулем __main__), и он будет перезагружен при импорте.

Пусть у меня есть c.py

print('hello') 
if __name__=="__main__": 
    import c 

Когда я запускаю его я получаю

hello 
hello 

Чтобы проиллюстрировать с помощью примера, если я изменю b.py к

import __main__ 

def bar(): 
    name = __main__.name 
    print(name) 

Он работает. Но только потому, что если кто-то импортирует a, у вас все еще есть два модуля и две копии переменной.

Если вам нужны общие данные, они должны быть в импортированных модулях, а не в сценариях верхнего уровня. Когда мне нужны общие данные, я создаю отдельный модуль, который ничего не импортирует (или только импорт из стандартной библиотеки), и он либо пуст, либо имеет значения по умолчанию для переменных, которые я хочу предоставить.

+0

Итак, я думаю, что общие данные будут работать, я создал c.py для цели тестирования и только написал имя = "foo" в него и сделал это работать, но дело в том, что если я хочу изменить имя общей переменной в c.py, скажем, «bar», как я могу сделать это с помощью a.py? – Lyux

+0

Если я понимаю ваш вопрос, его просто 'c.bar = c.foo'. И если вы хотите полностью избавиться от исходной переменной, это будет 'del c.foo'. – tdelaney

+0

c.py - это только 'name =" foo "' теперь, как я могу изменить переменную 'name' из a.py, так что теперь теперь' name = "bar" 'в c.py, вы можете задаться вопросом, почему i спросите об этом, потому что позже b.py получит переменную 'name' из c.py со значением' name = "bar" 'это то, что я понимаю по« общим данным ». – Lyux

Смежные вопросы