【python】-- 深浅copy、集合

深浅copy

1、数字、字符串的copy:

赋值(=)、浅拷贝(copy)和深拷贝(deepcopy)其实都一样,因为它们永远指向同一个内存地址:

>>> import copy
>>> n1 = 123
>>> print(id(n1))  #打印n1的内存地址
502665488
##赋值##
>>> n2 = n1
>>> print(id(n2))
502665488
##浅拷贝##
>>> n3 = copy.copy(n1)
>>> print(id(n3))
502665488
##深拷贝##
>>> n4 = copy.deepcopy(n1)
>>> print(id(n4))
502665488

2、列表、元组、字典copy:

赋值(=)

赋值只是创建一个变量,该变量指向原来的内存地址

>>> name1 = [‘a‘,‘b‘,[‘m‘,‘n‘],‘c‘]
>>> name2 = name1
#输出结果,两个内存地址是一样的
>>> print(id(name1),‘,‘,id(name2))
50077256 , 50077256

浅copy:

浅拷贝是指在内存地址中,只拷贝出第一层的内存的地址中的内容形成一个新的地址,第二层还是共用同一个内存地址:

>>> import copy
>>> name1 = [‘a‘,‘b‘,[‘m‘,‘n‘],‘c‘]
#浅copy
>>> name2 = copy.copy(name1)
>>> print(name1,‘,‘,id(name1))
[‘a‘, ‘b‘, [‘m‘, ‘n‘], ‘c‘] , 50228296
>>> print(name2,‘,‘,id(name2))
[‘a‘, ‘b‘, [‘m‘, ‘n‘], ‘c‘] , 50920008
#修改列表中的元素
>>> name1[0] = ‘h‘
>>> name1[2][0] = ‘M‘
>>> print(name1,‘,‘,id(name1))
[‘h‘, ‘b‘, [‘M‘, ‘n‘], ‘c‘] , 50228296
>>> print(name2,‘,‘,id(name2))
[‘a‘, ‘b‘, [‘M‘, ‘n‘], ‘c‘] , 50920008

深copy:

浅拷贝是指在内存地址中,拷贝name1第一层和第二层内存地址中的内容形成一个name2的两个新内存地址,两者内存地址不一致,所以无交集

>>> import copy
>>> name1 = [‘a‘,‘b‘,[‘m‘,‘n‘],‘c‘]
#深拷贝
>>> name2 = copy.deepcopy(name1)
>>> print(name1,‘,‘,id(name1))
[‘a‘, ‘b‘, [‘m‘, ‘n‘], ‘c‘] , 50142472
>>> print(name2,‘,‘,id(name2))
[‘a‘, ‘b‘, [‘m‘, ‘n‘], ‘c‘] , 50942280
>>> name1[0] = ‘h‘
>>> name1[2][0] = ‘M‘
>>> print(name1,id(name1),id(name1[2][0]))
[‘h‘, ‘b‘, [‘M‘, ‘n‘], ‘c‘] 50142472 10937320
>>> print(name2,id(name2),id(name2[2][0]))
[‘a‘, ‘b‘, [‘m‘, ‘n‘], ‘c‘] 50942280 4896280

集合

集合是无序的,天生不重复的数据组合,它的作用如下:

  • 去重,即:把一个列表变成集合,就去重了
  • 关系测试,即:测试两组集合的交集、并集和差集等
>>> name_1 = [1,2,3,4,7,8,7,10]
#把列表转换为集合
>>> name_1 = set(name_1)
#转换后,去重
>>> print(name_1,type(name_1))
{1, 2, 3, 4, 7, 8, 10} <class ‘set‘>

一、关系测试:

1、交集(intersection())、交集(&)

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.intersection(name_2) # name_1 & name_2
{8, 1, 10, 3}

2、并集(union())、并集(|)

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.union(name_2)# name_1 | name_2
{1, 2, 3, 4, 5, 7, 8, 10}

3、差集(difference())、差级(-)

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.difference(name_2) #name_1 - name_2
{2, 4, 7}

注:差集取的是数值在第一个集合中,但是不在第二个集合中(在我不在你)

4、对称差集(symmetric_difference())、对称差集(^)

把两个集合没有交集的数值取出来

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.symmetric_difference(name_2) #name_1 ^ name_2
{2, 4, 5, 7}

5、issubset()、是否是子集(<=)

判断一个集合是否是另一个集合的子集

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_3 = [1,2,3,4]
>>> name_1 = set(name_1)
>>> name_3 = set(name_3)
#输出结果
>>> name_3.issubset(name_1) # name_3 <= name_1
True

6、issuperset()、是否是父集(>=)

判断一个集合是否是另一个集合的父集

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_3 = [1,2,3,4]
>>> name_1 = set(name_1)
>>> name_3 = set(name_3)
#输出结果
>>> name_1.issuperset(name_3)# name_1 >= name_3
True 

7、isdisjoint()、

判断两个集合是否有交集,没有交集,则返回True

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_3 = [11]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
>>> name_3 = set(name_3)
#有交集
>>> name_1.isdisjoint(name_2)
False
#无交集
>>> name_1.isdisjoint(name_3)
True

二、 集合基本操作(增删改查)

添加(add())
>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
#添加已存在,不报错
>>> name_2.add(1)
>>> name_2
{8, 1, 10, 3, 5}
#添加不存在,添加一个新的数值
>>> name_2.add(11)
>>> name_2
{1, 3, 5, 8, 10, 11}

######################################

添加多项(update())

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2.update([12,13,14])
#输出结果
>>> name_2
{1, 3, 5, 8, 10, 12, 13, 14}

######################################
 删除(remove(),pop(),discard())

#1、remove()

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2
{8, 1, 10, 3, 5}
>>> name_2.remove(1)
#输出
>>> name_2
{8, 10, 3, 5}
#删除不存在的元素,会报错
>>> name_2.remove(1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 1
 注:用remove删除时,当元素不存在,会报错

#2、pop()

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2
{8, 1, 10, 3, 5}
#输出
>>> name_2.pop()
8
 注:pop是随机删除集合中的某个元素,并且打印

#3 discard()

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2.discard(10)
#输出结果
>>> name_2
{8, 1, 3, 5}
#删除不存在元素,不报错
>>> name_2.discard(10)
注:用discard删除不存在的元素,不会出现报错

######################################

长度(len())

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_1 = set(name_1)
#结果输出
>>> len(name_1)
7

######################################

#x in s

测试 x 是否是 s 的成员

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_1 = set(name_1)
#结果输出
>>> 1 in name_1
True

######################################

x not in s

测试 x 是否不是 s 的成员

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_1 = set(name_1)
#输出
>>> 12 not in name_1
True
时间: 2024-10-16 10:10:08

【python】-- 深浅copy、集合的相关文章

is == id 的用法;代码块;深浅copy;集合

1 内容总览 is == id 用法 代码块 同一代码块下的缓存机制 (字符串驻留机制) 不同代码块下的缓存机制 (小数据池) 总结 集合(了解) 深浅copy 2 具体内容 id is == # id 获取对象的内存地址,内存地址就相当于人的身份证号,唯一且不可变 # i = 100 # s = 'alex' # print(id(i)) #1892120688 # print(id(s)) #2707107640912 # == 比较的是两边的值是否相等 l1 = [1, 2, 3] l2

python深浅copy探究

引入 在python程序中,如果我们操作一个变量的值去做运算,而又想在下次调用时,仍使用原来的变量的值去做运算,那么我们我们就需要将这个变量去做备份,这就是本文所要探究的问题. 开始 变量-对象-引用: python中全部皆对象,Python中变量是指对象(甚至连type其本身都是对象,type对象)的引用,Python是动态类型,程序运行时候,会根据对象的类型来确认变量到底是什么类型. 我们有时候会见到这样一种情况: a = 1 b = a 这样做不就是把数据copy了一份吗,错,这样做只是在

python深浅copy和赋值

Python直接赋值,浅copy和深copy的比较 基于引用和对象(python引用和对象分离) 总结: 直接赋值:a = b -->a,b两个引用指向相同的对象 浅copy:a为b的copy --> copy(新建)b的不可变子对象,共用可变子对象 深copy:a为b的深copy-->copy(新建)b的所有子对象,两者对象无关联 ps:对象的值相等,内存地址不一定相同(小数据池) 详细解析如下: 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时

Python 深浅copy

#!/usr/bin/env python3import copy #copy 有两种#浅copy#copy.copy() #深copy#copy.deepcopy() '''######################### ## 字符串于数字的copy ## ######################### #内存地址相同,字符串于数字的copy永远都是用的内存中的唯一的地址#a = 123123#b = 123123#print(id(a))#print(id(b)) #a1 = 123

Python深浅copy

1 l1 = [1, 2, 3] 2 l2 = l1 3 l1.append('a') 4 print(l1, l2) # 深cpoy 5 6 l1 = [1, 2, 3] 7 l2 = l1.copy() # 浅拷贝 8 l2.append('a') 9 print(l1, l2) 1.其他代码 1 # 赋值运算 2 # l1 = [1,2,3] 3 # l2 = l1 4 # l1.append('a') 5 # print(l1,l2) 6 7 #copy 8 # l1 = [1,2,3]

python之集合、深浅copy、文件操作、函数初识

本节内容:集合.深浅copy.文件操作.函数初识 1.小知识点补充 2.编码二 3.集合 4.深浅copy 5.文件操作 6.函数的初识 1.小知识点补充                                                                                           1.1 小数据池====str.int 小数据池存在的意义就是节省内存 节省内存,位多个变量开辟一个共享空间(str和int) int:-5--256 int===

python之数据类型补充、集合、深浅copy

一.内容回顾 代码块: 一个函数,一个模块,一个类,一个文件,交互模式下,每一行就是一个代码块. is == id id()查询对象的内存地址 == 比较的是两边的数值. is 比较的是两边的内存地址. 小数据池: 前提:int,str,bool 1,节省内存. 2,提高性能和效率. 小数据池是什么? 在内存中,创建一个'池',提前存放了 -5 ~256 的整数,一定规则的字符串和bool值. 后续程序中,如果设置的变量指向的是小数据池的内容,那么就不会再内存中重新创建. 小数据池与代码块的关系

Python 集合 深浅copy

一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试,测试两组数据之前的交集.差集.并集等关系. 1,集合的创建. set1 = set({1,2,'barry'}) set2 = {1,2,'barry'} print(set1,set2) # {1, 2, 'barry'} {1, 2, 'barry'} 2,集合的增. set1 =

Python全栈__数据类型的补充、集合set、深浅copy

1.数据类型的补充 1.1 元组 当元组里面只有一个元素且没有逗号时,则该数据的数据类型与括号里面的元素相同. tu1 = ('laonanhai') tu2 = ('laonanhai') print(tu1, type(tu1)) print(tu2, type(tu2),) tu1 = (1) tu2 = (1,) print(tu1, type(tu1)) print(tu2, type(tu2)) tu1 = ([1, 2, 3]) tu2 = ([1, 2, 3],) print(t