我知道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)
但这并不完全符合我的好奇心,但如果黑客是唯一的方式,我会去那里,并希望知道最好的方式。
答案 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以获取解释