在 Python 中复制集合指的是创建一个新的集合,该集合包含与现有集合相同的元素。不同于简单的变量赋值,后者只是创建对原始集合的引用,复制确保对复制集合所做的更改不会影响原始集合,反之亦然。
在 Python 中有多种复制集合的方法,包括使用 copy() 方法、set() 函数或集合推导式。
使用 copy() 方法复制集合
集合类中的 copy() 方法用于创建集合对象的浅拷贝。
浅拷贝意味着该方法创建一个新的集合对象,但并不创建包含在原始集合中的对象的副本。取而代之的是,它复制指向这些对象的引用。
因此,如果原始集合包含可变对象(如列表、字典或其他集合),则对这些对象的修改将在原始集合和复制的集合中都反映出来。
语法
以下是 copy() 方法的语法:
set.copy()
返回值
copy() 方法返回一个新的集合,它是现有集合的浅拷贝。
示例
在下面的示例中,我们创建集合 "lang1" 的副本并将其存储在 "lang2" 中,然后使用 id() 获取两个集合及其内存地址。
在向 "lang1" 添加一个元素之后,我们再次获取两个集合及其内存地址以显示 "lang1" 和 "lang2" 是独立的副本:
lang1 = {"C", "C++", "Java", "Python"}
print("lang1: ", lang1, "id(lang1): ", id(lang1))
lang2 = lang1.copy()
print("lang2: ", lang2, "id(lang2): ", id(lang2))
lang1.add("PHP")
print("After updating lang1")
print("lang1: ", lang1, "id(lang1): ", id(lang1))
print("lang2: ", lang2, "id(lang2): ", id(lang2))
输出
这段代码将产生以下输出:
lang1: {'Python', 'Java', 'C', 'C++'} id(lang1): 2451578196864
lang2: {'Python', 'Java', 'C', 'C++'} id(lang2): 2451578197312
After updating lang1
lang1: {'Python', 'C', 'C++', 'PHP', 'Java'} id(lang1): 2451578196864
lang2: {'Python', 'Java', 'C', 'C++'} id(lang2): 2451578197312
使用 set() 函数复制集合
Python 中的 set() 函数用于创建一个新的集合对象。它接受一个可迭代对象作为参数并将其转换为集合,在此过程中移除任何重复的元素。如果没有提供参数,它将创建一个空集合。
我们可以通过将原始集合作为参数传递给 set() 构造函数来复制集合。这创建了一个包含原始集合所有元素的新集合,从而确保对新集合的任何修改都不会影响原始集合。
示例
在这个示例中,我们使用 set() 函数创建 "original_set" 的副本并将其存储在 "copied_set" 中:
original_set = {1, 2, 3, 4}
copied_set = set(original_set)
print("copied set:", copied_set)
copied_set.add(5)
print("copied set:",copied_set)
print("original set:",original_set)
上述代码的输出如下:
copied set: {1, 2, 3, 4}
copied set: {1, 2, 3, 4, 5}
original set: {1, 2, 3, 4}
使用集合推导式复制集合
集合推导式是在 Python 中创建集合的一种简明方式。它通过迭代一个可迭代对象并可选地应用条件来过滤元素从而生成一个新的集合。其语法与列表推导式类似,但使用花括号 {} 而不是方括号 []:
{expression for item in iterable if condition}
我们可以通过迭代原始集合的元素并直接使用这些元素创建一个新的集合来复制集合。
示例
在下面的示例中,我们创建一个名为 "original_set" 的原始集合,然后使用集合推导式将其复制到 "copied_set" 中:
original_set = {1, 2, 3, 4, 5}
copied_set = {x for x in original_set}
print("Copied set:", copied_set)
上述代码的输出如下:
Copied set: {1, 2, 3, 4, 5}