Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中通过引用分配变量?_Python - Fatal编程技术网

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

如何在python中通过引用分配变量?,python,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))

我模糊地理解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

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

你不能改变这个

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

o.a = 2
就你而言

x = 2
只生成一个值为2的新变量,与上面的“x=o.a”语句无关(表示最后一个语句无效)

有效的方法是:

x = o
这将参考o。 然后说

x.a = 2

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

简单的答案是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会注意到不再有对“真长字符串”字符串对象的引用,它将被销毁/解除分配。

我认为,即使是包含字符串、整数等的变量,实际上也是对这些类型的对象的引用。例如
>>>a=“a”;>>>a2=“a”;>>>a是a2;True
整数、浮点数和字符串是通过引用分配的;它们恰好是不可变的感谢快速响应我根据上面的评论编辑了我的答案;谢谢。所以,我认为现在有一种方法可以使x引用o.a而不是o.a的值?无论o.a发生什么变化,都无法使x发生变化,除非您让它们都引用同一个可变对象(例如列表),然后修改该对象(例如更改该列表的内容)。