python线程问题、深浅拷贝、属性动态设置

一、发现之前没有线程的日志,写了一个简单的,参考来源:https://www.cnblogs.com/vamei/archive/2012/10/11/2720042.html

import threading
def demo(i):
    print("线程名",i)

try:
    i = 0
    # 开启线程数目
    tasks_number = 10
    print('测试启动')
    ths = []
    # threadLock = threading.Lock()
    while i < tasks_number:
        # target:运行目标内容, name:线程名 ,这里的args会作为target入参
        t = threading.Thread(target=demo,name=f"线程{i}",args=(i,))
        ths.append(t)
        i += 1
    for i in ths:
        i.start()
    for i in ths:
        i.join()
    print("退出线程")
except Exception as e:
    print(e)

二、深浅拷贝

浅拷贝只复制指向某个对象的指针而不复制对象本身,新旧对象还是共享同一块内存。

但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象

import copy
a=['hello',[1,2,3],{'a':1,'b':2},[[1],2]]
b=a
c=copy.copy(a)
print([id(x) for x in a])
print([id(x) for x in b])

a[0]='world'
a[1].append(4)
a[2]['a']=5

print('a=',a)
# a= ['world', [1, 2, 3, 4], {'a': 5, 'b': 2}, [[1], 2]]
print('b=',b)
# b= ['world', [1, 2, 3, 4], {'a': 5, 'b': 2}, [[1], 2]]
print('c=',c)
# c= ['hello', [1, 2, 3, 4], {'a': 5, 'b': 2}, [[1], 2]]
# 由于a[1]是不可变数据类型,所以a[0]修改了,c[0]仍然指向的是原来的地址

参考来源:https://zhuanlan.zhihu.com/p/25221086

三、属性动态设置

1、hasattr(object, name)
判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。
2、getattr(object, name[,default])
获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
3、setattr(object, name, values)
给对象的属性赋值,若属性不存在,先创建再赋值。
4、delattr(object, name)
delattr函数用于删除name属性
delattr(x, ‘foobar’)相当于del x.foobar