例如,假设您有一个类:
class Test:
def __init__(self,t1,t2):
self.t1 = t1
self.t2 = t2
但问题是,我不知道它是什么类,也不知道里面有什么变量(t1
和t2
),但我需要访问它们,有没有办法把变量放在字典里,比如字典里的键是变量名,值是变量的值?
我也许能够解决这个问题,因为我正在使用它来进行我所谓的“解析”(尽管我不确定这个词的正确用法),在这里我正在解决一个bug,其中的代码:
a = [1,2,3]
b = a
b[0] += 1
print(a)
输出[2,2,3]
而不是[1,2,3]
,我写了一个函数来处理这个问题:
def parse(l):
if type(l) == dict:
l2 = {}
for i in l.keys():
if (type(l[i]) == list) or (type(l[i]) == tuple) or (type(l[i]) == dict):
l2[i] = parse(l[i])
else:
l2[i] = l[i]
else:
l2 = []
for i in l:
if (type(i) == list) or (type(i) == tuple) or (type(i) == dict):
l2.append(parse(i))
else:
l2.append(i)
return l2
它所做的是递归地遍历列表、元组和字典中的所有值,直到它到达既不是列表、元组也不是字典的值(通常是一个字符串或数字)并返回它。问题是,它不把类识别为需要“解析”的东西,这导致它们不是,而它们必须是,所以我需要这段代码也能为类工作。可能有一个更好的方法来“解析”,我不知道,所以请让我知道如何。
1条答案
按热度按时间x4shl7ld1#
如果你正在处理任何类的示例,python已经把它的变量值存储在一个字典里了,如果H是Test的示例,那么H.__dict__会给予你一个字典,把变量名作为字符串Map到它们的值。
也就是说,你的“bug”实际上并不是bug,这是Python(以及许多其他语言)的一个特性。Python中的对象是通过引用传递的,在列表的上下文中,这意味着你正在将内存中那个列表的地址传递给b,所以现在a和b都引用了内存中的同一个空间。如果你想要一个副本,只需写
如果a是一个不可变对象的列表,那么就完成了。
如果a有列表、自定义对象、集合和其他内容,那么你需要一个deepcopy()
它将复制,并递归地创建其中所有内容的副本