我可以为变量添加第二个名称吗?

时间:2011-10-17 14:39:31

标签: python namespaces

我需要说服自己这是一个坏主意。我想为同一个变量分配第二个名称,其内容可能会改变。

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

我希望A和B都打印'Alice',而B打印'Bob',A打印'Alice'。

为什么我要这样做?在我的代码中,我使用一个名称来表示一些数据,这对于处理是有意义的,但是另一个名称对于用户输入是有意义的。 argparse似乎想根据命令行选项分配变量名。所以我想在输入数据时使用一个名称,但在处理数据时使用另一个名称。我宁愿避免将一个复制到另一个,但那是我的后备位置。

4 个答案:

答案 0 :(得分:6)

Python strings are immutable

  

在Python中,字符串对象是不可变的 - 每次字符串都是   分配给变量的新对象在内存中创建以表示   新的价值。

维基百科文档immutability and specific Python example

获得所需行为的一种简单方法是将字符串包装在类中:

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&amp; B指向同一个对象。

答案 1 :(得分:3)

如果你真的想确信这是一个坏主意,也许你的argparse示例你想要重命名所使用的变量与选项名称不同。使用dest option of argparse.add_argument

只有文档中的一个示例:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')

答案 2 :(得分:2)

我认为处理部分应该是与输入部分分开的模块,因此两者都没有任何理由知道另一部分。输入数据并将其存储在适当的位置,并使用您想要的任何名称将其作为参数传递给处理部分。

答案 3 :(得分:2)

您只能对Python将变量视为引用名称的值执行此操作,例如:列表,词典等。

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

将两次打印“Alice”。