2016-11-05 4 views
0

Ниже приведена часть кода из моего последнего проекта.Python - copy.deepcopy() не работает при копировании локальной области в глобальную переменную области видимости

import copy 

chg = None 

def change(obj): 
    print("obj =", obj) 
    chg = copy.deepcopy(obj) 
    #chg = obj 
    print("chg = obj =", chg) 

class B(): 

    def __init__(self): 
     setattr(self, 'example_member', "CHANGED!") 
     self.configure() 

    def configure(self): 
     global chg 
     change(self.example_member) 
     print("chg on inside =", chg) 

b = B() 
print("print chg on global =", chg) 

Так дело в том, я ожидал глобального изменения его значения от None до значения obj «s.

Так что я ожидал ниже выхода:

obj = CHANGED! 
chg = obj = CHANGED! 
chg on inside = CHANGED! 
print chg on global = CHANGED! 

Однако он пришел к моему удивлению, что глобальный идентификатор не меняется вообще. Ниже приведен результат, полученный по вышеуказанному коду.

obj = CHANGED! 
chg = obj = CHANGED! 
chg on inside = None 
print chg on global = None 

Так что мне нужно сделать для того, чтобы сделать глобальную с местным контекстной obj/example_member значение объекта? Я новичок в Python, поэтому некоторые объяснения могут так же хорошо мне помочь. :)

ответ

2

Вы должны объявить как global в функции change(), в противном случае это локально. Назначение внутри функции имени, не объявленному как globalв функции, изменяет новую переменную на локальную область.

def change(obj): 
    global chi      # <<<<< new line 
    print("obj =", obj) 
    chg = copy.deepcopy(obj) 
    #chg = obj 
    print("chg = obj =", chg) 

Дает:

obj = CHANGED! 
chg = obj = CHANGED! 
chg on inside = CHANGED! 
print chg on global = CHANGED! 

Однако было бы лучше, чтобы избежать использования глобального, как это.

+0

Что лучше? Как насчет того, нужен ли мне объект, который должен работать во множестве модулей? Я не могу придумать другого более чистого способа, чем сделать объект глобальным или статическим. Передача объекта по модулю в модуль сильно затрудняет обслуживание. –

+0

Кстати, я сейчас работаю с Python с Pyside. Мне нужно передать объект, относящийся к конкретному виджету во всех модулях. Любые руководства для такого рода работ, которые не нуждаются в каких-либо глобальных переменных? :) –

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