2016-09-06 3 views
0

У меня есть следующие модули:Как изменить значение переменной в другом модуле?

test.py

import test1 


var1 = 'Test1' 
var2 = 'Test2' 

print var1 
print var2 

test1.modify_vars(var1, var2) 

print var1 
print var2 

и модуль

test1.py

def modify_vars(var1, var2): 
    var1 += '_changed' 
    var2 += '_changed' 

Я ожидаю получить следующее мощность:

Test1 
Test2 
Test1_changed 
Test2_changed 

я получаю:

Test1 
Test2 
Test1 
Test2 

Оно является обязательным, чтобы избежать импорта тестового модуля в модуль test1.

Как достичь этого, не возвращая значения из метода? (вид ссылки)

+1

* «Я ожидаю получить следующий результат» * - почему? Вы передаете непреложный объект. Какую * актуальную проблему вы пытаетесь решить? – jonrsharpe

+0

Я знаю, что это неизменно, я просто хочу добиться этого в некотором роде, и я опубликовал то, что я должен достигнуть –

ответ

3

Строки неизменяемы. Вы не можете делать то, что хотите. Использование += со строкой всегда будет возвращать новую строку, которая не будет иметь ничего общего с var1 и var2.

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

var = ['Test1', 'Test2'] 
... 

def modify_var(var): 
    var[0] += '_changed' 
    var[1] += '_changed' 
+0

приятное решение. Я был очень удивлен, увидев, что это работает. Почему вам не нужно возвращаться? – Glostas

+0

@Glostas, потому что на этот раз он изменяет изменяемый объект (список) – jonrsharpe

+0

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

-1

Ваша функция пропускает возвращаемое значение

var1 = 'Test1' 
var2 = 'Test2' 

def modify_var(var1, var2): 
    var1 += '_changed' 
    var2 += '_changed' 
    return (var1,var2) 


(var1,var2) = modify_var(var1,var2) 
print var1,var2 

Работает.

Я считаю, это требует минимальных изменений в вашем коде.

Протестировано с помощью python 2.7

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