python——copy模块

本文介绍了Python中的copy模块,重点讨论了深拷贝和浅拷贝的概念。深拷贝创建全新对象,而浅拷贝仅复制引用。对于不可变对象,直接赋值即可,简单可变对象如list可以使用浅拷贝,但涉及嵌套结构的可变对象则需深拷贝以确保独立性。文章提供了相关函数和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

包括深拷贝和浅拷贝操作的模块。

首先要分清变量对象的概念,python中的变量类似指针,指向各个对象。比如a=2,是有一个名为a的变量指向了2这个对象;x=[1,2,3]中变量x指向对象[1,2,3]。

然后,在python中,int、float、str、tuple和bool等都是不可变对象,list、set和dict是可变对象。可变对象可以原地修改,而不可变对象不能原地修改。

指向不可变对象的变量,若要修改,会指向内存处的新对象。可变对象是在原内存处修改,此时,若有不同变量指向同一可变对象,则这些变量都会被修改。

#下面使用str和list类型举例:
a='abc'
b=a
a='xyz'
print(a,b)
#输出:xyz abc 可见a,b指向了不同的对象
x=[1,2,3]
y=x
x[0]=
### Python 中 `threading` 模块的使用教程 #### 创建和启动线程 可以通过继承 `Thread` 类或传递目标函数的方式来创建新线程。 对于通过继承的方式实现多线程: ```python import threading import time class WorkerThread(threading.Thread): def run(self): print('Start working') time.sleep(1) print('End work') worker = WorkerThread() worker.start() worker.join() # 等待直到该线程终止[^4] ``` 另一种更简单的方法是直接指定一个可调用对象作为参数来初始化 `Thread` 实例,这通常是一个普通的函数: ```python def task(): print('Start working') time.sleep(1) print('End work') task_thread = threading.Thread(target=task) task_thread.start() task_thread.join() # 阻塞当前上下文环境的主线程,直到调用了 join 方法的那个线程执行结束为止[^2] ``` #### 守护线程 vs. 非守护线程 默认情况下,所有线程都是非守护线程。这意味着程序会等待这些线程完成之后才会退出。如果设置为守护线程,则当仅剩余守护线程时,整个应用程序将会立即关闭而不会等待它们完成工作。 要将线程设为守护模式,在创建后但在启动前调用 `.setDaemon(True)` 或者是在构造器中传入 daemon 参数[^1]: ```python daemon_thread = threading.Thread(target=some_function, daemon=True) daemon_thread.start() # 或者也可以这样写 another_daemon = threading.Thread(target=some_other_function, args=(arg,), kwargs={'kw': 'value'}, daemon=True) another_daemon.start() ``` #### 同步原语——锁机制 为了防止多个线程同时访问共享资源造成数据竞争条件,可以利用同步工具如互斥锁 (`Lock`) 来保护临界区代码片段。 下面的例子展示了如何安全地更新全局计数器变量而不发生竞态错误: ```python counter = 0 lock = threading.Lock() def update_counter(): global counter with lock: # 自动获取并释放锁 local_copy = counter local_copy += 1 time.sleep(0.1) # 模拟耗时操作 counter = local_copy threads = [threading.Thread(target=update_counter) for _ in range(10)] for t in threads: t.start() for t in threads: t.join() print(f'Final Counter Value: {counter}') # 应该总是打印 "Final Counter Value: 10"[^3] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值