2016-03-27 51 views
0

我知道Python不像Perl和其他人那樣使用引用,但是可以創建一個鏈接值簡單的變量,因爲它們引用相同的內存地址?我知道列表和字典的淺拷貝包含引用相同地址的值。將兩個變量指向Python中的相同值

>>> foo = 1 
>>> bar = foo 
>>> bar = 0 
>>> foo 
1 
>>> foo = [1,2] 
>>> bar = foo 
>>> bar[1] = 0 
>>> foo 
[0,2] 

參考在Perl

$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

在Python中,你會值存儲在某個對象,你可以參考一下。例如,你可以把它作爲唯一的元素放在列表中,例如'[x]',然後使用對列表的引用。或者你可以把它放在'dict'中,或者爲它創建一個'class'。 –

回答

0

爲什麼不只是創建一個@property功能將以第2名,但返回的第一個值?

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傳遞。

+0

爲什麼這個答案downvoted?我認爲有什麼不對,但我對@property裝飾器不太熟悉。 –

+0

我最終使用這個解決方案。謝謝 –

1

您無法更改immutable對象。您只能重新分配參考。

foo = bar = 1 
bar = 0 

在這裏,你不破壞1在內存中,這是不可改變的約,你只是重新分配bar0

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

有一種方法可以通過深層拷貝來「破解」它。

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

檢查here用於解釋

+0

這裏不需要深入複製,他們仍然會引用相同的列表 – Fredrik

相關問題