Python:变量的复制

13

有没有一种方法可以复制一个变量,使得当变量'a'的值改变时,它会自动将自身复制到变量'b'中?

例如:

a='hello'

b=a     #.copy()  or a function that will make a copy

a='bye'

# Is there a way to make 
# 'b' equal 'a' without 
# doing 'b=a'

print a
print b

我在使用Tkinter库时遇到了问题,我有一个已经存储在列表中的checkbutton,并且我尝试获取它所持有的变量。

但是需要5行代码才能到达该变量。

是否有一种方式可以保持变量的副本,在checkbutton变量更改时也随之更改?


你为什么想要那个?直接使用 a 不就好了吗? - John Mee
可能是 在Python中模拟指针 的重复内容。 - James Sumners
1
请参阅 Python:如何通过引用传递变量? - Martijn Pieters
5个回答

20

你正在探索Python如何处理引用。赋值仅仅是将右侧的对象绑定到一个引用上。因此,这有些琐碎:

a = 'foo'
b = a
print b is a  #True -- They *are the same object*

然而,一旦你这样做:

b = 'bar'
b is a  #False -- they're not longer the same object because you assigned a new object to b

现在对于那些可以被改变的可变对象,事情真的变得很有趣:

a = [1]
b = a
b[0] = 'foo'
print a  #What?? 'a' changed?

在这个案例中,a 发生了变化,因为 ba 引用的是同一个对象。当我们对可变类型的 b 做出改变时(因为它是可变的),我们会在 a 中看到相同的变化,因为它们是同一个对象。

所以,回答您的问题,您不能直接做到这一点,但如果您使用了可变类型(比如列表)来存储实际的数据,您可以间接地实现它。


当编写 Python 代码时,理解这些内容非常重要,并且这并不是许多其他编程语言的工作方式,因此需要认真思考/研究,直到您真正理解为止。


3
我来这里是为了找到一种方法,防止第三种情况中的行为(要复制的对象是可变的)。如果其他人也想了解同样的信息,我最终发现除了使用copy.copy或copy.deepcopy之外,您还可以使用以下语法来创建一个新对象并取消原始对象的可变性--如果所需对象可以以这种方式实例化: new_dict = dict(olddict) # 复制 new_set = set(L) # 将列表转换为集合 new_tuple = tuple(L) # 将列表转换为元组``` - Jacob J

2
简而言之,仅通过简单的数值赋值是无法实现这一点的。正如您所见到的:
a=4
b=a
a=5

>>> print b
4

然而,对于像列表这样的可变对象,你是可以这样做的。代码如下:
a=[1]
b=a
a.append(2)

>>> print a
[1,2]
>>> print b
[1,2]

1

根据您想要做什么,您可能需要查看weakref模块

这可以让您拥有一个主对象,然后有几个副本,一旦主对象消失,副本将变为 None


0

有一种丑陋的方法可以通过一个临时列表创建一个简单变量的独立副本:

a = 6; 
b = [a][0]

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接