如何在python中通过引用分配变量?

时间:2014-09-03 08:54:48

标签: python

我的模糊理解是python按价值分配。有没有办法通过引用分配python变量?那么,在下面的例子中,它实际上会将o.a改为2?

class myClass():
    def __init__(self):
        self.a = 1

    def __str__(self):
        _s = ''
        for att in vars(self):
            _s += '%s, %s' %(att, getattr(self,att))
        return _s


o = myClass()
x = o.a
x = 2
print o

2 个答案:

答案 0 :(得分:4)

简单的答案是python中的所有变量都是引用。一些引用是不可变对象(如字符串,整数等),一些引用是可变对象(列表,集合)。更改引用对象的值(例如添加到现有列表)和更改引用(更改变量以引用完全不同的列表)之间存在细微差别。

在您的示例中,您最初x = o.a使变量x成为o.a的引用(对1的引用)。当您执行x = 2时,您正在更改x引用(现在引用2,但o.a仍然引用1

关于内存管理的简短说明:

Python会为您处理所有这些内存管理,所以如果您执行以下操作:

x = "Really_long_string" * 99999
x = "Short string"

当第二个语句执行时,Python会发现没有更多对“真正长字符串”字符串对象的引用,它将被销毁/解除分配。

答案 1 :(得分:1)

实际上,这取决于类型。整数,浮点数,字符串等是不可变的,例如对象的实例是可变的。

你无法改变这一点。

如果你想改变o.a,你需要写:

o.a = 2

在你的情况下

x = 2

只创建一个值为2的新变量,它与&x; x = o.a'无关。上面的陈述(意思是最后一个陈述没有效果)。

可行的是:

x = o

这将引用o。 而不是说

x.a = 2

这也将改变o.a,因为x和o将引用同一个实例。