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

Python 我可以为变量添加第二个名称吗,python,namespaces,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” 我为什么要这样做?在我的代码中,我使用一个名称来表示一点数据,这对于处理是有意义的,但是不同的名称对于用户输入是有意义的。argpa

我需要说服自己这是个坏主意。我想为同一个变量指定另一个名称,该变量的内容可能会更改

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似乎希望根据命令行选项分配变量名。因此,我希望在输入数据时使用一个名称,但在处理数据时使用另一个名称。我希望避免将一个复制到另一个,但这是我的退路。

:

在Python中,字符串对象是不可变的——每次输入字符串时 分配给变量时,将在内存中创建一个新对象来表示 新的价值观

维基百科上的文档

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

class MyClass:
    SomeStr = "Any Val"

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

print(A.SomeStr)
print(B.SomeStr)
输出:

所以现在你的B=A赋值创建了一个浅拷贝。。。两个变量A和B指向同一个对象。

在Python中,字符串对象是不可变的——每次输入字符串时 分配给变量时,将在内存中创建一个新对象来表示 新的价值观

维基百科上的文档

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

class MyClass:
    SomeStr = "Any Val"

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

print(A.SomeStr)
print(B.SomeStr)
输出:


所以现在你的B=A赋值创建了一个浅拷贝。。。这两个变量A和B指向同一个对象。

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

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

< P>您只能对Python将变量考虑到引用的名称(例如列表、字典等)的值进行处理。
A=["Bob"]
B=A
A[0] = "Alice"
print A, B

将打印爱丽丝两次。

< p>您只能对Python考虑变量引用的名称(例如列表、字典等)的值进行操作。

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

将打印Alice两次。

如果您真的想确信这是一个坏主意,那么对于您的argparse示例,您可能希望重命名使用的变量,使其与选项名不同。使用

文档中只有一个示例:

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

如果您真的想确信这是一个坏主意,那么对于您的argparse示例,您可能希望重命名正在使用的变量,使其与选项名不同。使用

文档中只有一个示例:

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

好主意但我必须单独传递变量,而不是传递整个对象。好主意。但我必须单独传递变量,而不是传递整个对象。@vzwick:恰恰相反,所有东西都是指针。它只是指向一个对象的指针,因此没有指向指针的指针,这是需要的。@delnan谢谢你的解释,伙计。现在我知道了我永远不会学的语言,关键似乎是当变量的值改变时,指针的内容没有改变,变量只是被分配给一个新的指针。嗯,指针被分配给变量。@vzwick:对象不变性的概念在很多语言中都有出现。字符串和许多其他类型在Java和C中是不可变的,就像两种示例语言一样。最好用你选择的语言来学习这个概念和地点,因为无论你现在是否意识到它,它都很可能存在。仅供参考:Javascript字符串也是不可变的:Python语义的这一点与对象im-/mutability问题无关,尽管两者确实相互作用。但许多其他语言都缺乏明确的指针,这一点仍然是事实。在我看来,Lisp、Lua、Java、JavaScript都是如此。实际上,Python和JS在这方面是相同的,Ruby是C的非不安全/托管子集,大多数人都需要和使用它。应该注意的是,可以使用具有单个字段的对象来相当容易地模拟指向指针的指针。还应该注意的是,如果任何惯用代码认为这是必要的,那么很少有人会这样做@维兹维克:恰恰相反,一切都是指针。它只是指向一个对象的指针,因此没有指向指针的指针,这是需要的。@delnan谢谢你的解释,伙计。现在我知道了我永远不会学的语言,关键似乎是当变量的值改变时,指针的内容没有改变,变量只是被分配给一个新的指针。嗯,指针被分配给变量。@vzwick:对象的概念
不变性在许多语言中都有出现。字符串和许多其他类型在Java和C中是不可变的,就像两种示例语言一样。最好用你选择的语言来学习这个概念和地点,因为无论你现在是否意识到它,它都很可能存在。仅供参考:Javascript字符串也是不可变的:Python语义的这一点与对象im-/mutability问题无关,尽管两者确实相互作用。但许多其他语言都缺乏明确的指针,这一点仍然是事实。在我看来,Lisp、Lua、Java、JavaScript都是如此。实际上,Python和JS在这方面是相同的,Ruby是C的非不安全/托管子集,大多数人都需要和使用它。应该注意的是,可以使用具有单个字段的对象来相当容易地模拟指向指针的指针。还应该注意的是,如果任何惯用代码认为这是必要的,那么很少有人会这样做;啊!!这正是我在这个特殊情况下所需要的。一票赞成。但既然这不是我问的问题,我将选择一个不同的回答作为答案。对不起,啊!这正是我在这个特殊情况下所需要的。一票赞成。但既然这不是我问的问题,我将选择一个不同的回答作为答案。很抱歉