python - 将列表传递给类 python

标签 python python-3.x

<分区>

我有这个简单的类:

class revs:
    def __init__(self, rev, us, accs = []):
        self.rev = rev
        self.us = us
        self.accs = accs

我有这段代码将值分配给列表并且在循环内

rev, usu = cada_l.split("|")
acct = each_l[:2].strip()
list_acct.append(acct)

最后,我创建了一个字典,来管理这样的转速列表:

drevs = {}
cada = revs(rev, us, list_acct)
drevs[cada.rev] = cada

它可以与 rev 和 us 一起正常工作,但是 list_acct 会不断更新所有实例:

drevs['1'].rev
'1'
drevs['2'].rev
'2'
drevs['1'].us
'user1'
drevs['2'].us
'user2'
drevs['1'].accs
'["Doc1","Doc2"]'
drevs['2'].accs
'["Doc1","Doc2"]'

如果我更改 list_acct.clear(),所有实例中的值都很清楚,我对 Python 还是很陌生,这让我很困惑。

谢谢

最佳答案

这看起来像是在发生,因为您将相同的列表传递给每个对象。因此,所有对象都保持对同一个列表的引用,并且由于 list 是可变的,它似乎会同时更改“所有”对象。

要解决此问题,请在每次创建 revs 对象时传入一个空列表,或者克隆您传入的列表:

cada = revs(rev, us, list_acct[:])

请注意,如果 list_acct 包含可变对象,您仍然可能再次遇到同样的问题,但更深一层!

如果您在创建列表时根本没有将列表传递给 revs 对象(我不知道,因为您没有显示完整的代码!),那么您有同样的问题,但出于不同的原因:在 Python 中,默认参数都在函数定义时计算一次。因此,您可以获得此行为:

r1 = revs(1, 1)
r2 = revs(2, 2)
r1.accs.append("Hi!")
print(r1.accs) # prints ['Hi!']
print(r2.accs) # prints ['Hi!']

因为 revs 构造函数的默认参数总是指向同一个列表。参见 this question有关原因的解释,但要绕过它,只需使用 None 作为默认值而不是 []

class revs:
    def __init__(self, rev, us, accs=None):
        self.rev = rev
        self.us = us
        if accs is None:
            accs = []
        self.accs = accs

关于python - 将列表传递给类 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16720361/

相关文章:

python-3.x - 为列表列表中的每个列表将字符串插入索引[0]。 Python

python - 将二进制字符串转换为二进制文字

Java:如何恢复使用 python 的 zlib 编码器压缩的字符串数据

python - 更改 for 循环中的迭代次数

python - 排除 os.walk 中的目录

linux - 在 MX150 上安装 tensorflow-gpu 时出错

python-3.x - 在 raspbian/ubuntu 上,pip 一直指向 python 2.7 而不是 3.7

Python - itertools.groupby

python - Django 麻烦 : django. setup() 抛出 "ImportError: No module named ' project_name'"

python-3.x - 适用于 Python 的必应图像搜索 SDK : Getting 'Permission Denied'