分配引用
在Python中,有没有办法给变量赋值引用呢?
比如在PHP中,我可以这样做:
$a = 10;
$b = &$a;
$a = 20;
echo $a." ".$b; // 20, 20
那我在Python中怎么做同样的事情呢?
2 个回答
2
在Python中,所有东西默认都是引用。这意味着当你做类似下面的事情时:
x=[1,2,3]
y=x
x[1]=-1
print y
它会打印出 [1,-1,3]。
但是当你这样做时:
x=1
y=x
x=-1
print y
就会出现问题,原因是 int
(整数)是 不可变的。也就是说,它们不能被改变。想想看,数字真的会改变吗?当你给 x
赋一个新值时,其实是 赋予一个新值,并不是在改变旧的值。所以 y
仍然指向的是旧的值。其他不可变的类型(比如字符串和元组)也是这样工作的。
12
在Python中,如果你处理的是非基本类型(也就是复杂类型),那么它的行为就像你想的那样:赋值是通过引用来进行的。这就是为什么当你运行下面的代码时:
>>> a = {'key' : 'value'}
>>> b = a
>>> b['key'] = 'new-value'
>>> print a['key']
你会得到 'new-value'
。
严格来说,如果你这样做:
>>> a = 5
>>> b = a
>>> print id(a) == id(b)
你会得到 True。
但是!因为基本类型是不可变的,你不能直接改变变量 b
的值。你只能基于 b
创建一个新变量,并赋予它一个新值。例如,如果你这样做:
>>> print id(b)
>>> b = b + 1
>>> print id(b)
你会得到两个不同的值。
这意味着Python创建了一个新变量,计算了它的值,这个值是基于 b
的值,然后把这个新变量命名为 b
。这适用于所有不可变类型。把前面两个例子结合起来看:
>>> a = 5
>>> b = a
>>> print id(a)==id(b)
True
>>> b += 1
>>> print id(b)==id(a)
False
所以,在Python中,当你进行赋值时,你总是赋值的是引用。但有些类型是不能被改变的,所以当你进行一些修改时,实际上是创建了一个新的变量,并给它一个不同的引用。