python - 类中的python列表范围
问题描述
我遇到了这段代码的一些意外行为:
from pprint import pprint
class a (object):
x = ['1']
class b (a):
x = a.x
x.append('2')
class c (a):
x = a.x
x.append('3')
class d (a):
x = a.x
x = 'nothing'
if __name__ == '__main__':
pprint(a.x)
pprint(b.x)
pprint(c.x)
pprint(d.x)
我收到输出:
['1', '2', '3']
['1', '2', '3']
['1', '2', '3']
'nothing'
但我希望收到:
['1']
['1', '2']
['1', '3']
'nothing'
我不明白的是:
- 为什么附加到 b 类的列表也会附加到 a 类的列表?
- 为什么追加到类 c 中的该列表追加到 b 和 a?
- 为什么不将该变量重新分配给 d 类中的字符串对其他 3 个类没有影响?
解决方案
1. 2.执行此操作时,x = a.x
您只是分配x
指向唯一现有的列表,a
在操作此时,来自 so的那个会x
反映,a.x
因为这是同一个列表,而不是副本。class b
这对于和都是正确的class c
。做一个副本
x = list(a.x)
3.当x='nothing'
你分配一个x
不再指向列表的字符串时,就是这样
推荐阅读
- javascript - 将 1 个同步和 1 个异步变量传递给下一个异步函数
- networking - 我的数据包标头包含什么 IP 地址?
- ios - 使用 RealityKit 和 SwiftUI 扫描和检测对象
- next.js - Next-Auth 返回“QueryFailedError:列 User.name 不存在”?
- excel - Excel - 删除单个单元格中的重复项(非 VBA 方法)
- entity-framework-core - 使用 Npgsql EnableRetryOnFailure - 发生重试时是否有任何可见性/日志记录?
- android - Android RecyclerView 生命周期 - 数据保存等
- javascript - 结合 2 个复杂的 Javascript 函数
- azure-application-insights - Application Insights starttrackevent stoptrackevent 在单个会话中跨页面
- c# - 如何通过单元测试执行 C# wpf 命令