python 关于集合,还有浅拷贝和深拷贝的问题

最近看的只是有点散就随便写写:
关于集合数学上把集合乘坐由不同的元素组成的,所以对象是一组无序可排列的可哈希的值。这里需要注意两点集合有两种 a)可变合集(set) b)不可变合集(frozenset),集合中的值是不重复的。
可变合集是可以不可以哈希的,而不可变合集是可以哈希的可以作为字典的键。
可变集合的增加

>>> s
{'a'}
>>> s.update('a')
>>> s
{'a'}
>>> s.update('b')
>>> s
{'b', 'a'}
>>> s.add('add')
>>> s
{'b', 'a', 'add'}
>>> s.update('add')
>>> s
{'b', 'a', 'd', 'add'}

set.add()是一个对象一个对象增加,set.update()是迭代着增加。

可变合集的删除

>>> s
{'b', 'a', 'd', 'add'}
>>> s.remove('a')
>>> s
{'b', 'd', 'add'}

合集不能改变
合集的查询(遍历)
直接输出

浅拷贝和深拷贝的问题
深拷贝完全生成一个值完全相同的值只是内存地址不同。

import copy
msg = ['1', '2', '3', ['1','2']]
msg1 = copy.deepcopy(msg)
print(msg1,msg)
print(id(msg[3][1]),id(msg1[3][0]))

['1', '2', '3', ['1', '2']] ['1', '2', '3', ['1', '2']]
1649409880336 1649376984232

浅拷贝生成一个生成一个一层是不同地址但值相同的对象,二层即以下层对象与原对象相同。

msg = ['1', '2', '3', ['1','2']]
msg1 = msg.copy()
print(msg1, id(msg1),msg, id(msg))
print(id(msg[3][0]),id(msg1[3][0]))

['1', '2', '3', ['1', '2']] 2346271286344 ['1', '2', '3', ['1', '2']] 2346270474504
2346266819752 2346266819752
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的集合是一种可变对象,因此浅拷贝可能会导致意外的结果。浅拷贝只是复制了集合对象本身,而不是其中的元素。因此,如果你修改了浅拷贝集合,原始集合也会受到影响。 举个例子,假设你有一个集合`original_set`,它包含了一些元素。你想要创建一个新的集合`shallow_copy_set`,并且将`original_set`中的元素复制到`shallow_copy_set`中。你可以使用`copy()`方法来进行浅拷贝,如下所示: ``` original_set = {1, 2, 3} shallow_copy_set = original_set.copy() ``` 现在,你对`shallow_copy_set`进行了修改,添加了一个新的元素: ``` shallow_copy_set.add(4) ``` 如果你现在打印`original_set`,你会发现它也包含了新添加的元素4,这是因为它们共享了相同的元素对象。 为了避免这种情况,你可以使用深拷贝(`copy.deepcopy()`)来创建一个完全独立的集合副本,这样你就可以修改它而不会影响原始集合。 ### 回答2: 在Python中,对于集合浅拷贝是出错的。所谓浅拷贝是指创建一个新的对象,其中包含原始对象的引用,而不是创建原始对象的副本。对于简单的数据类型如整数、字符串等,浅拷贝是可以正常工作的。但是对于集合类型,如列表、字典和集合本身,浅拷贝存在一些问题。 当我们使用浅拷贝来复制一个集合时,新的集合将包含原始集合中元素的引用。这意味着对新集合的修改也会影响原始集合,因为它们引用相同的对象。这在某些情况下可能会导致意外的结果,特别是在修改集合中的可变对象时。 为了解决这个问题,我们可以使用深拷贝来创建一个集合的副本,其中包含原始集合中元素的副本而不是引用。深拷贝可以通过`copy`模块的`deepcopy`函数来实现。深拷贝不仅会复制集合本身,还会递归复制其中的每个对象,使得新集合与原始集合完全独立。 以下是一个简单的例子,展示了集合浅拷贝问题: ``` import copy original_set = {1, 2, [3, 4]} shallow_copy = copy.copy(original_set) shallow_copy.add(5) print(original_set) # 输出 {1, 2, [3, 4], 5} shallow_copy[2].append(6) print(original_set) # 输出 {1, 2, [3, 4, 6], 5} ``` 从上面的例子可以看出,使用浅拷贝创建的新集合`shallow_copy`与原始集合`original_set`共享相同的列表对象。因此,对新集合中的列表对象进行修改会影响原始集合。 综上所述,Python中对于集合浅拷贝会出错,需要使用深拷贝来复制集合以避免意外修改原始集合。 ### 回答3: Python中的集合(set)是可变对象,而浅拷贝(shallow copy)是一种创建新对象的方式,新对象与原对象的元素是共享的。但是,集合存在一个特性,即其元素是唯一的,不允许重复。这就导致了在浅拷贝集合时可能会出现一些问题。 在进行集合浅拷贝时,会创建一个指向原始集合的新对象,但是新对象和原始集合之间共享了同一组元素。这意味着在对新对象进行操作时,会影响到原始集合。 例如,我们有一个包含一些元素的集合A,然后通过浅拷贝创建了一个新的集合B。当我们向集合B中添加一个元素时,原始集合A也会受到影响,因为它们共享同一组元素。这是因为集合的唯一性要求,在新对象中添加的元素也会被加入到原始集合中。 解决这个问题的一种方法是使用深拷贝(deep copy),它会创建一个全新的集合对象,其中不包含任何原始集合的元素。这样就能确保在对新对象进行操作时不会影响到原始集合。 可以使用copy模块中的deepcopy函数来进行深拷贝操作,例如: ```python import copy setA = {1, 2, 3} setB = copy.deepcopy(setA) setB.add(4) print(setA) # 输出{1, 2, 3} print(setB) # 输出{1, 2, 3, 4} ``` 总之,由于集合的特性,使用浅拷贝会导致新对象和原对象共享同一组元素,进而影响到原始集合。如果需要创建一个完全独立的集合对象,可以使用深拷贝来解决这个问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值