亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于python中元組、字典的可變性。

關于python中元組、字典的可變性。

慕田峪7331174 2019-02-17 17:33:36
對可變對象的疑慮點,請各位大佬指點迷津,多謝! 問題描述: 元組tuple的元素只能容納不可變對象,且其中的元素可以是列表list,因為實際存放的是列表(可變對象)的地址,只要這個可變列表的地址不變,就算列表中的元素變化了,也不能說是元組元素的變動。 字典dict的key不能是可變元素,因為需要用key去hash取值。如果此時key為列表(可變對象),則字典會報錯:TypeError: unhashable type: 'list'。 那么問題來了: 同樣是可變元素list,為什么在元組tuple里面作為元素值是合法的、是取地址的、是不可變的,但是在字典dict里面作為key的值就是非法的、是取值的、是可變的。 這樣的設計,感覺不符合使用上的一致性或直觀的理解性吧,因為規則不一致。
查看完整描述

3 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

dict 的 key 必須要是能夠 hash
元組是一組值的序列。 其中的值可以是任意類型, 使用整數索引,

s = ([1,2],[2]) # 有list 存在不能夠hash
print(type(s))
print(hash(s))
s2 = list(1,2)
print(hash(s2)) # 
查看完整回答
反對 回復 2019-03-01
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

你想當然地對“不可變序列”這個詞語產生了誤解。
首先我們要理解,何為“不可變對象”。

objects whose value is unchangeable once they are created are called immutable.
翻譯過來,如果一個對象的value不可改變,那么該對象就是“不可變”的。

然后我們思考下,序列的value是什么東西。

Some objects contain references to other objects; these are called containers. Examples of containers are tuples, lists and dictionaries. The references are part of a container's value.
翻譯過來,序列/容器的value就是該序列中的“元素的id”。是元素的id,而不是元素的value,懂了嗎?還不懂就看python官方手冊的《Data model》章節。
>>> foo=([1,2], [3,4]) #包含可變對象的【不可變序列】
>>> [id(i) for i in foo] #之中所有元素的id,就是【不可變序列】的value
[1747679411912, 1747679411848]
>>> foo[0][0]=5 #修改【不可變序列】的元素的value,而非修改【不可變序列】的value
>>> foo
([5, 2], [3, 4])
>>> [id(i) for i in foo] #【不可變序列】的value沒有改變
[1747679411912, 1747679411848]
查看完整回答
反對 回復 2019-03-01
  • 3 回答
  • 0 關注
  • 669 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號