在Python中将两个变量指向相同的值

时间:2016-03-27 17:04:40

标签: python reference

我知道Python不能与引用一起使用,不像Perl和其他人,但它是否可以创建一个值为链接的简单变量,因为它们引用相同的内存地址?我知道列表和字典的浅表副本包含引用相同地址的值。

>>> foo = 1
>>> bar = foo
>>> bar = 0
>>> foo
1
>>> foo = [1,2]
>>> bar = foo
>>> bar[1] = 0
>>> foo
[0,2]
Perl中的

Cf。

$ref = 1
$foo = \$ref
$bar = $foo
print $$bar //gives 1
$$foo = 0
print $$bar //gives 0

原因是我很好奇它如何在Python中完成/黑客攻击。 举一个具体的例子是我本来希望给出一个二级“同义”属性。 我想通过掩盖第二个值可以让这样的一个shenanigan(未经测试,对不起,如果错误):

class fake:
   def __init__(self,template):
       self.ref = template # keep alive
       self.__dict___ = template.__dict__
       self.__class___ = template.__class__
   def __getitem__(self):
       return self.ref.__getitem__
   def __setitem__(self,value):
       self.ref.__setitem__(value)

但这并不完全符合我的好奇心,但如果黑客是唯一的方式,我会去那里,并希望知道最好的方式。

3 个答案:

答案 0 :(得分:1)

您无法更改immutable个对象。您只能重新分配参考。

foo = bar = 1
bar = 0

此处你没有在内存中销毁1,这就是不变性,你只需重新指派bar指向0

foo = bar = [1,2] 
bar[1] = 100 

在此处更改内存中的引用对象。

>>> b = 1
>>> id(b)
15216984
>>> b = 2
>>> id(b)
15216960  # reference points to another object
>>> a = [1,2]
>>> id(a)
139917071841904
>>> a[0] = 100
>>> id(a)
139917071841904 # object is the same, therefore all references pointed to it will show changes  

答案 1 :(得分:0)

为什么不创建一个具有第二个名称的@property函数,但返回第一个值?

class C:
    def __init__(self):
        self.attr1 = 12345

    @property
    def synonym(self):
        return self.attr1

    @synonym.setter
    def synonym(self, value):
        self.attr1 = value

这样就可以将对synonym的引用传递给attr1

答案 2 :(得分:-1)

有一种方法来破解'用深度镜检查。

from copy import deepcopy
foo = [1,2]
bar = deepcopy(foo)
bar[1] = 0
print bar, foo

检查here以获取解释