[英]Set dictionary value to a variable, not the variable's value
In [1]: a = None
In [2]: b = None
In [3]: A = {'a': a, 'b': b}
In [4]: A
Out[4]: {'a': None, 'b': None}
In [5]: a = 1
In [6]: A
Out[6]: {'a': None, 'b': None}
我正在嘗試將對變量的引用分配給字典值。 我不想將變量的值分配給字典的值。 有辦法做到這一點嗎? 基本上,我希望最后一行顯示為:
{'a': 1, 'b': None}
我認為這是最接近python的方法:
class myobj:
def __init__(self):
self.mystr=""
@property
def mystr(self):
return self.mystr
@mystr.setter
def mystr(self, val):
self.mystr=val
def __repr__(self):
return str(self)
def __str__(self):
return self.mystr
a = myobj()
a.mystr = 'a'
names={'a': a}
print names
a.mystr = 'b'
print names
不,因為整數在Python中是不可變的。 有關詳細信息,請參見Python數據模型 。 您只能按照以下方式更改字典值:
A['a'] = 1
設置a = 1
,實際上是在創建一個新的a ,這就是為什么它不反映在字典中的原因。 從文檔中 :
類型影響對象行為的幾乎所有方面。 甚至對象標識的重要性在某種意義上也受到影響:對於不可變的類型,計算新值的操作實際上可能返回對具有相同類型和值的任何現有對象的引用,而對於可變對象,則不允許這樣做。 例如,在a = 1之后; b = 1,取決於實現,a和b可以或可以不使用值1引用同一對象,但是在c = []之后; d = [],保證c和d引用兩個不同的,唯一的,新創建的空列表。 (請注意,c = d = []將相同的對象分配給c和d。)
Python不支持引用。 即使在函數中,所有方法參數都是按值傳遞的。 您可以將可變數據結構傳遞給函數並修改數據結構,但是所描述的內容是不可能的。
讓我用一些不同的方式來解釋。 如果您是python的新手,希望這對您有所幫助:
讓我使用一個列表對象(可變)來獲取不同對象的不同ID。
>>> a = [1]
>>> id(a)
4405572168
>>> A = {'a': a}
>>> id(A['a'])
4405572168
>>>
到目前為止,我們獲得了與a and A['a']
相同的ID。
現在讓我們將另一個對象綁定到名稱a
>>>
>>> a = {1: 2}
>>> id(a)
140196067104096
>>> id(A['a'])
4405572168
>>>
在上面的例子中,我將一個新的dict對象綁定到a
並檢查a and A['a']
的身份,現在它們不同了,因為名稱a
綁定到了一個全新的對象上。
這是引用計數的另一種解釋:
>>> a = [1]
>>> sys.getrefcount(a)
2
>>> A = {'a': a}
>>> sys.getrefcount(a)
3
>>>
>>> a = {1: 2}
>>> sys.getrefcount(a)
2
>>>
你可以看到在引用計數的下降之后,我們重新綁定到一個新的名字,這意味着它的一個全新的對象綁定到a
。 因此,您將看不到A的更改。
其他語言的變量分配是python中的名稱綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.