知识点1:
介绍
当表示set集合为空集合时候,值得注意的地方:
在 Python 中,{} 是用来定义空字典(dict)的语法,而不是空集合(set)。
因此,当你写 s = {} 时,Python 会将其解释为一个空字典,而不是一个空集合。
空集合的定义方式:在 Python 中,集合(set)是一个无序且不重复的元素集合。集合的定义方式是使用 set() 函数,而不是用 {}。
案例如下:
# 定义一个空字典
s = {}
print(type(s)) # 输出结果:<class 'dict'>
# 定义一个空集合
s = set()
print(type(s)) # 输出结果:<class 'set'>
知识点2:
介绍
s = {1,6,8}
print(type(s)) # 输出结果:<class 'set'>
print(s) # 输出结果:{8, 1, 6}
s = {1,8,6}
print(s) # 输出结果:{8, 1, 6}
尽管集合的输出结果看起来是一样的。这是因为集合的元素顺序是不确定的,并且在某些情况下,Python 的实现细节导致了相同的输出顺序。但这并不意味着集合的顺序是固定的,它只是偶然的结果。
小结:
# 集合(set)是无序的,它不保证元素的存储顺序。
# 在 Python 中,集合的内部实现是基于哈希表的,
# 这意味着集合中的元素存储顺序与它们被添加的顺序无关,而是由哈希值决定的。
知识点3
介绍
哈希表(Hash Table),也称为散列表,是一种通过哈希函数将数据映射到存储位置的数据结构,用于实现快速的插入、查找和删除操作。它是一种非常高效的数据结构,广泛应用于编程语言的底层实现(如字典、集合等)以及各种需要快速数据访问的场景。
知识点4
介绍
在 Python 中,集合(set)的元素必须是**可哈希(hashable)**的类型。这是因为集合的内部实现基于哈希表,而哈希表需要通过哈希值来快速定位和管理元素。
1. 可哈希(Hashable)的定义
一个对象是可哈希的,如果它满足以下条件:
-
它有一个哈希值,可以通过
hash()函数计算。 -
哈希值在其生命周期内保持不变(即对象的内容不能改变)。
Python 中的不可变类型(如 int、float、str、tuple 等)通常是可哈希的,因为它们的值不可变。而可变类型(如 list、dict、set 等)通常是不可哈希的,因为它们的内容可以改变。
知识点5
介绍
集合(set)本身是可变的,但集合中的元素必须是不可变的。
集合的“可变性”与“不可变性”的解析:
集合的“可变”:
集合(set)是一种可变的数据结构,这意味着你可以随时添加或删除其中的元素。例如:
s = {1, 2, 3}
s.add(4) # 添加元素
s.remove(2) # 删除元素
print(s) # 输出:{1, 3, 4}
由于集合的内容可以改变,它本身是可变的。
集合的“不可变性”
1)不可变集合(frozenset):frozenset是一个不可变的集合类型,它不能被修改,但它的元素同样必须是不可变的。

frozenset 的特性
-
不可变性:
frozenset的内容在创建后不能被修改,包括添加、删除或修改元素。 -
可哈希性:由于不可变性,
frozenset是可哈希的,可以作为字典的键或其他集合的元素。 -
无序性:与普通集合一样,
frozenset是无序的,不支持索引访问。 -
去重性:
frozenset中的元素是唯一的,重复的元素会被自动去除。
2)集合中的元素必须是不可变的,例如,可以将整数、浮点数、字符串、元组等不可变类型放入集合中,但不能将列表、字典、集合等可变类型直接放入集合中。
知识点6
介绍
查询set集合中某一个单一元素的hash值

查询set结合中所有元素的hash值
"一" 的 Unicode 编码值是 20000。
"路" 的 Unicode 编码值是 36771。
"发" 的 Unicode 编码值是 21471。
知识点7
介绍


这里能看到“一路发发”的每次hash值不一样。
原因:
从 Python 3.3 开始,为了增强安全性,Python 引入了哈希值随机化(Hash Randomization)。这意味着每次运行 Python 程序时,字符串等对象的哈希值可能会不同。哈希值随机化是为了防止某些类型的攻击(如拒绝服务攻击)和减少哈希冲突的可能性。
因此,当你在不同运行环境中运行代码时,或者在不同时间运行代码时,字符串 "一路发发" 的哈希值可能会不同。
如何避免哈希值随机化?
如果你需要在不同运行环境中获得一致的哈希值,可以设置环境变量 PYTHONHASHSEED 为一个固定的值(例如 0)。这会禁用哈希值随机化。

1. import os
这行代码的作用是导入 Python 的 os 模块。os 模块提供了与操作系统交互的功能,包括操作文件和目录、获取环境变量、设置环境变量等。
2. os.environ["PYTHONHASHSEED"] = "0"
这行代码的作用是设置环境变量 PYTHONHASHSEED 的值为 "0"。环境变量 PYTHONHASHSEED 是 Python 用于控制哈希值随机化的种子值。
具体解释:
-
PYTHONHASHSEED:-
这是一个特殊的环境变量,用于控制 Python 中字符串和其他可哈希对象的哈希值计算方式。
-
默认情况下,Python 会随机化哈希值的种子(即
PYTHONHASHSEED的值),以增强安全性(防止某些类型的攻击)。 -
设置
PYTHONHASHSEED为一个固定的值(如"0"),可以禁用哈希值的随机化,使得每次运行程序时,相同的字符串或对象总是生成相同的哈希值。
-
-
os.environ:-
这是一个字典对象,表示当前进程的环境变量。
-
通过
os.environ,你可以读取或修改环境变量。
-
-
"0":-
将
PYTHONHASHSEED设置为"0",表示禁用哈希值的随机化。 -
如果设置为其他值(如
"1"或"42"),哈希值仍然会随机化,但每次运行程序时,随机化的种子是固定的。
-
温馨提醒:在大多数情况下,不建议固定哈希值,尤其是在涉及安全性的场景中。固定哈希值可能会带来一些安全风险,
知识点8
介绍
这里举例说明,集合里面元素的不重复性
s = {8, 1, 6, 6}
print(sorted(s))
输出结果为:
[1, 6, 8]
为什么没有两个 6?
-
集合的特性:
-
集合的定义是无序且不重复的元素集合。
-
如果你尝试将重复的元素添加到集合中,集合会自动忽略重复的元素。
-
-
集合的去重机制:
-
当你创建集合时,Python 会自动检查元素是否重复。
-
如果发现重复的元素,集合只会保留一个。
-
知识点9
介绍
为什么 s = {8,1,6,6}这个set集合在输出结果的时候,变更成了[1,6,8]列表类型?
[1, 6, 8]
1. 集合(set)和列表(list)的区别
-
集合(
set):-
使用
{}定义(注意:空集合需要用set()定义)。 -
是一个无序且不重复的元素集合。
-
不支持索引访问(因为它是无序的)。
-
示例:
s = {8, 1, 6, 6},输出结果为{1, 6, 8}。
-
-
列表(
list):-
使用
[]定义。 -
是一个有序的元素集合,允许重复。
-
支持索引访问。
-
示例:
lst = [8, 1, 6, 6],结果为[8, 1, 6, 6]。
-
2. sorted() 函数的作用
sorted() 是 Python 的内置函数,用于对可迭代对象(如列表、集合、字典等)进行排序,并返回一个新的列表。它的返回值类型总是 list,而不是其他类型。
-
当你对集合进行排序时,
sorted()会:-
将集合中的元素提取出来。
-
按照从小到大的顺序对元素进行排序。
-
返回一个有序的列表。
-
所以最后的输出结果为:
[1, 6, 8]

762

被折叠的 条评论
为什么被折叠?



