Могу ли я добавить второе имя в переменную - PullRequest
1 голос
/ 17 октября 2011

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

A='Bob'
B=A #wrong function, I want to figure out something that works here.
A='Alice'
print A
print B

Я хочу, чтобы и A, и B печатали «Алису», но вместо этого B печатает «Bob», а A печатает «Alice».

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

Ответы [ 4 ]

6 голосов
/ 17 октября 2011

Строки Python являются неизменяемыми :

В Python объект строки является неизменным - каждый раз, когда строка присваивается переменной, в памяти создается новый объект для представленияновое значение.

Документ из Википедии о Неизменяемость и конкретный пример Python .

Один простой способ получить желаемое поведение - заключить строку в класстаким образом:

class MyClass:
    SomeStr = "Any Val"

A = MyClass
A.SomeStr = "Bob"
B=A
B.SomeStr = "Alice"

print(A.SomeStr)
print(B.SomeStr)

Вывод:

>>> 
Alice
Alice

Итак, теперь ваше назначение B = A создает «мелкую» копию ... Две переменные, A &B указывают на тот же объект.

3 голосов
/ 17 октября 2011

Если вы действительно хотите убедиться, что это плохая идея, возможно, для вашего примера argparse вы захотите переименовать используемую переменную, чтобы она отличалась от имени опции.Используйте dest вариант argparse.add_argument

Только один из примеров из документа:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
2 голосов
/ 17 октября 2011

Это можно сделать только для значений, которые Python считает переменными именами ссылок, например списками, словарями и т. Д.

A=["Bob"]
B=A
A[0] = "Alice"
print A, B

напечатает «Алису» дважды.

2 голосов
/ 17 октября 2011

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

...