python中使用list作为类属性进行初始化时的注意事项

作为一种面向对象的编程语言,“类”在python中的应用非常普遍。有时候,我们需要将list作为某个类的属性。进一步的,在有些场景下,我们希望能够对某个list属性进行初始化。如果需要进行这步操作,那一定要注意了。
譬如,如果有一个类的Article,其定义为:

class Article:
    def __init__(self,subject='',paragraph_list=[]):
        self.subject = subject
        self.paragraph_list = paragraph_list

当需要使用初始化类时:

articleinfo1 = Article()
articleinfo2 = Article()

若有操作:

articleinfo1.paragraph_list.append('paragraph1.1')
articleinfo1.paragraph_list.append('paragraph1.2')

articleinfo2.paragraph_list.append('paragraph2.1')
articleinfo2.paragraph_list.append('paragraph2.2')

打印:

    for paragraph in articleinfo2.paragraph_list:
        print(paragraph)

会发现显示:

paragraph1.1
paragraph1.2
paragraph2.1
paragraph2.2

这肯定不是我们想要的结果。
打印两个paragraph_list的id:

    print(id(articleinfo1.paragraph_list))
    print(id(articleinfo2.paragraph_list))

发现相同。原因应该是这两个Article实例引用相同的paragraph_list地址,因此,解决办法有两个:
一是在初始化时,指定paragraph_list的初始化值:

    articleinfo1 = Article('subject1',[])
    articleinfo2 = Article('subject2',[])

二是将Article的定义修改为:

class Article:
    def __init__(self,subject=''):
        self.subject = subject
        self.paragraph_list = []
### Python 编程注意事项 #### 重要事项与最佳实践 编写高质量的 Python 代码涉及多个方面,包括但不限于遵循 PEP8 规范、合理利用数据结构以及理解复制机制。 对于可变和不可变的数据型的处理尤为重要。Python 中存在六种标准数据型,其中 Number(数字)、String(字符串)和 Tuple(元组)属于不可变型;而 List(列表)、Dictionary(字典)和 Set(集合)则是可变的[^1]。当操作这些不同性质的对象,应当注意其特性带来的影响: - **浅复制 vs 深复制** 浅复制仅创建新对象的一层副本而不递归地复制嵌套对象的内容,因此修改深层级中的元素会影响原对象。相反,深复制会完全独立地构建整个对象树的新实例,从而避免这种副作用。例如,在给定 `list1 = [[1,3], 'python', 666]` 的情况下执行浅复制后,任何对内部列表 `[1,3]` 的更改都会反映到源列表上。为了防止这种情况发生并实现真正的分离,应该采用深复制方法。 ```python import copy original_list = [[1, 3], "python", 666] shallow_copied_list = original_list.copy() # 使用 .copy() 方法进行浅复制 deep_copied_list = copy.deepcopy(original_list) # 调用 deepcopy 函数来进行深复制 print("Original:", id(original_list), "\nShallow Copy:", id(shallow_copied_list)) print("\nDeep Copy:", id(deep_copied_list)) # 修改其中一个列表内的子项来看看效果差异 original_list[0][0] = 999 print("\nAfter Modification:") print("Original:", original_list) print("Shallow Copied:", shallow_copied_list) print("Deep Copied:", deep_copied_list) ``` 此段代码展示了如何通过不同的方式来复制复杂的数据结构,并观察它们之间的区别。 #### 常见错误及预防措施 开发过程中常见的陷阱之一就是忽视了某些内置函数的行为细节或是误解了特定语法糖背后的逻辑。比如,默认参数值在定义即被求值一次而不是每次调用重新计算,这可能导致意外的结果特别是当默认参数是指向可变容器的候。为了避免此问题的发生,建议总是传递 None 型作为占位符并在函数体内初始化实际使用的变量。 另一个容易犯错的地方在于文件 I/O 操作期间未妥善管理资源释放过程。即使遇到异常情况也要确保关闭打开过的流以防止内存泄漏等问题出现。上下文管理器 (`with` 语句) 提供了一种优雅的方式来自动完成这项工作。 最后,多线程编程中如果不加锁同步共享状态,则可能引发竞态条件或死锁现象。正确运用 threading 库里的 Locks 和 RLocks 工具可以帮助规避这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值