python集合的元素可以是_Python集合的元素中,為什么不可以是包含嵌套列表的元組?...

你有一個誤解,hash算法針對的是元素的內容,并不是針對指針,所以指針不變不等于可hash。

如果你想深究細節的話,可以看tuple的源碼:

static Py_hash_t

tuplehash(PyTupleObject *v)

{

Py_uhash_t x; /* Unsigned for defined overflow behavior. */

Py_hash_t y;

Py_ssize_t len = Py_SIZE(v);

PyObject **p;

Py_uhash_t mult = _PyHASH_MULTIPLIER;

x = 0x345678UL;

p = v->ob_item;

while (--len >= 0) {

y = PyObject_Hash(*p++);

if (y == -1)

return -1;

x = (x ^ y) * mult;

/* the cast might truncate len; that doesn't change hash stability */

mult += (Py_hash_t)(82520UL + len + len);

}

x += 97531UL;

if (x == (Py_uhash_t)-1)

x = -2;

return x;

}

注意這里有一個循環,tuple會對其中每個元素調用PyObject_Hash,將結果進行異或運算再加上一個常量作為整個tuple的hash。

如果tuple中有一個元素是list,那么PyObject_Hash將調用list的hash算法,然而list定義就表明它根本不實現hash:

PyTypeObject PyList_Type = {

PyVarObject_HEAD_INIT(&PyType_Type, 0)

"list",

sizeof(PyListObject),

0,

(destructor)list_dealloc, /* tp_dealloc */

0, /* tp_print */

0, /* tp_getattr */

0, /* tp_setattr */

0, /* tp_reserved */

(reprfunc)list_repr, /* tp_repr */

0, /* tp_as_number */

&list_as_sequence, /* tp_as_sequence */

&list_as_mapping, /* tp_as_mapping */

PyObject_HashNotImplemented, /* tp_hash */

...

再看 PyObject_HashNotImplemented 的實現:

Py_hash_t

PyObject_HashNotImplemented(PyObject *v)

{

PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",

Py_TYPE(v)->tp_name);

return -1;

}

這個信息很眼熟吧?

結論就是,只要tuple中有一個元素是不可hash的(不限于list),那么整個tuple都是不可hash的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539219.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python lib庫_python_lib基礎庫

1:argv傳遞給python腳本的命令行參數列表,argv[0]是腳本的名字(他是平臺獨立的,不管他是一個路徑全名或不是),如果使用了-c參數選項,argv[0]會被設置為字符串-c,如果沒有腳本名傳遞給python解釋器&#xff…

hive復合數據類型之map

概述 MAP:MAP包含key->value鍵值對,可以通過key來訪問元素。比如”userlist”是一個map類型,其中username是key,password是value;那么我們可以通過userlist[username]來得到這個用戶對應的password; 操…

Beego框架使用

為什么80%的碼農都做不了架構師&#xff1f;>>> Beego Web項目目錄結構 new 命令是新建一個 Web 項目&#xff0c;我們在命令行下執行 bee new <項目名> 就可以創建一個新的項目。但是注意該命令必須在 $GOPATH/src 下執行。最后會在 $GOPATH/src 相應目錄下…

oracle下lag和lead分析函數

Lag和Lead分析函數可以在同一次查詢中取出同一字段的前N行的數據(Lag)和后N行的數據(Lead)作為獨立的列。 這種操作可以代替表的自聯接&#xff0c;并且LAG和LEAD有更高的效率。 語法&#xff1a; [sql] view plaincopy /*語法*/ lag(exp_str,offset,defval) over() Lead(…

802d簡明調試手冊_SINUMERIK-828D簡明調試手冊.pdf

SINUMERIK 828D / 828D BASIC簡明調試手冊SINUMERIKAnswers for industry. SIEMENSABC01.2012 ASINUMERIK 828D / 828D BASIC V04.04SP01123PLC 45NC 67PLC 891011121314151617PLC 18i1 11.1 11.1.1 NC 31.1.2 31.2

jtessboxeditorfx 界面顯示不出來_macOS 使用 XQuartz 支持 X11 實現 Linux 圖形化界面顯示...

更多奇技淫巧歡迎訂閱博客&#xff1a;https://fuckcloudnative.io前言在 Windows 中相信大家已經很熟悉使用 Xmanager(Xshell), MobaXterm, SecureCRT 通過 X11 實現 Linux 圖形化界面顯示&#xff0c;我的需求是在 macOS 下使用 iTerm2 作為 Terminal 實現 X11 圖形化界面顯示…

EntityFramework Core 2.0 Explicitly Compiled Query(顯式編譯查詢)

前言 EntityFramework Core 2.0引入了顯式編譯查詢&#xff0c;在查詢數據時預先編譯好LINQ查詢便于在請求數據時能夠立即響應。顯式編譯查詢提供了高可用場景&#xff0c;通過使用顯式編譯的查詢可以提高查詢性能。EF Core已經使用查詢表達式的散列來表示自動編譯和緩存查詢&a…

Oracle Minus關鍵字 不包含 取差集

Oracle Minus關鍵字   SQL中的MINUS關鍵字   SQL中有一個MINUS關鍵字&#xff0c;它運用在兩個SQL語句上&#xff0c;它先找出第一條SQL語句所產生的結果&#xff0c;然后看這些結果有沒有在第二個SQL語句的結果 中。如果有的話&#xff0c;那這一筆記錄就被去除&#xff0…

python掃描器甄別操作系統類型_20189317 《網絡攻防技術》 第三周作業

一.教材內容總結1.網絡踩點&#xff1a;web搜索與挖掘、DNS和IP查詢、網絡拓撲偵察(1)網絡踩點目標確定(2)技術手段&#xff1a;web信息搜索與挖掘、DNS和IP查詢、網絡拓撲偵察(3)web信息搜索與挖掘&#xff1a;基本搜索與挖掘技巧、高級搜索與挖掘技巧、編程實現google搜索、元…

python 網頁重定向_小試牛刀:python爬蟲爬取springer開放電子書.

首先聲明,本文旨在記錄反思,并沒有資源,代碼也不具有借鑒意義(水平實在不行.某天,水群的時候發現群友發了一個文件,里面是疫情時期springer開放的免費電子書名單,同時還附有下載鏈接,總共有400多本,這要是一個一個下載不得累死個人,只下載自己感興趣的書也是一個好主意,但是,我…

直面桌面云帶來的現狀優勢

在桌面云解決方案里&#xff0c;首先&#xff0c;所有的數據以及運算都在服務器端進行&#xff0c;客戶端只是顯示其變化的影像而已&#xff0c;所以在不需要擔心客戶端來非法竊取資料&#xff0c;我們在電影里面看到的商業間諜拿著 U 盤瘋狂的拷貝公司商業機密的情況再也不會出…

ORA-28001: the password has expired解決方法

Oracle提示錯誤消息ORA-28001: the password has expired&#xff0c;是由于Oracle11G的新特性所致&#xff0c; Oracle11G創建用戶時缺省密碼過期限制是180天&#xff08;即6個月&#xff09;&#xff0c; 如果超過180天用戶密碼未做修改則該用戶無法登錄。 Oracle公司是為了數…

.net 導出excel_Qt編寫的項目作品18-數據導出到Excel及Pdf和打印數據

一、功能特點原創導出數據機制&#xff0c;不依賴任何office組件或者操作系統等第三方庫&#xff0c;尤其是支持嵌入式linux。10萬行數據9個字段只需要2秒鐘完成。只需要四個步驟即可開始急速導出大量數據到Excel。同時提供直接寫入數據接口和多線程寫入數據接口&#xff0c;不…

hive數據庫定義

默認數據庫"default" 可以顯式切換數據庫&#xff1a;hive> use 數據庫名; 創建 hive>CREATE DATABASE [IF NOT EXISTS] mydb [LOCATION] /....... [COMMENT] ....; 實例 hive (default)> create database test_db comment test database; OK Ti…

圖像增強_Keras 常用的圖像增強方式

歡迎關注 “小白玩轉Python”&#xff0c;發現更多 “有趣”在使用神經網絡和深度學習模型時&#xff0c;需要進行數據準備。對于更復雜的物體識別任務&#xff0c;也越來越需要增加數據量。數據增加意味著增加數據量。換句話說&#xff0c;擁有更大的數據集意味著更健壯的模型…

Facebook產品經理的三年敘事與協作思考

產品經理和研發工程師的關系經常被大家調侃&#xff0c;可偏偏就有同時受到研發和設計都喜歡的“別人家的產品經理”&#xff0c;溝通協調、對接需求、項目把控面面俱到還有好人緣。有沒有人天生就是產品經理&#xff1f;產品經理的工作就是寫需求寫需求和寫需求么&#xff1f;…

sis新地址_堅若磐石不掉速,老平臺升級新選擇,入手昱聯Asint 500G SSD

我是文章的原作者&#xff0c;文章首發于&#xff1a;什么值得買愛折騰的老狐貍?zhiyou.smzdm.com首發文章鏈接&#xff1a;堅若磐石不掉速&#xff0c;老平臺升級新選擇&#xff0c;入手昱聯Asint 500G SSD _值客原創_什么值得買?post.smzdm.com雖然說&#xff0c;現在越來越…

hive表定義(3種方式)

創建表 方式一 建表語法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ..…

進度條設置_為你的練習設置進度條

在我們的日常練習中&#xff0c;遇到最多的一個問題就是不知道自己練得怎么樣了&#xff1f;還需不需要繼續&#xff0c;或者調整練習方法。這種問題大多出現在自學吉他的學生當中&#xff0c;因為得不到老師的反饋&#xff0c;自己練得對不對&#xff0c;夠不夠&#xff0c;都…

Python之路(第二篇):Python基本數據類型字符串(一)

一、基礎1、編碼 UTF-8:中文占3個字節 GBK&#xff1a;中文占2個字節 Unicode、UTF-8、GBK三者關系 ascii碼是只能表示英文字符&#xff0c;用8個字節表示英文&#xff0c;unicode是統一碼&#xff0c;世界通用碼&#xff0c;規定采用2個字節對世界各地不同文字進行編碼&#x…