python-3.x 如何发现课堂上的未知变量?

lsmd5eda  于 2023-02-26  发布在  Python
关注(0)|答案(1)|浏览(134)

例如,假设您有一个类:

class Test:
    def __init__(self,t1,t2):
        self.t1 = t1
        self.t2 = t2

但问题是,我不知道它是什么类,也不知道里面有什么变量(t1t2),但我需要访问它们,有没有办法把变量放在字典里,比如字典里的键是变量名,值是变量的值?
我也许能够解决这个问题,因为我正在使用它来进行我所谓的“解析”(尽管我不确定这个词的正确用法),在这里我正在解决一个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

它所做的是递归地遍历列表、元组和字典中的所有值,直到它到达既不是列表、元组也不是字典的值(通常是一个字符串或数字)并返回它。问题是,它不把类识别为需要“解析”的东西,这导致它们不是,而它们必须是,所以我需要这段代码也能为类工作。可能有一个更好的方法来“解析”,我不知道,所以请让我知道如何。

x4shl7ld

x4shl7ld1#

如果你正在处理任何类的示例,python已经把它的变量值存储在一个字典里了,如果H是Test的示例,那么H.__dict__会给予你一个字典,把变量名作为字符串Map到它们的值。

print(Test(1,2).__dict__)
# Prints {'t1': 1, 't2': 2}

也就是说,你的“bug”实际上并不是bug,这是Python(以及许多其他语言)的一个特性。Python中的对象是通过引用传递的,在列表的上下文中,这意味着你正在将内存中那个列表的地址传递给b,所以现在a和b都引用了内存中的同一个空间。如果你想要一个副本,只需写

b = a.copy()

如果a是一个不可变对象的列表,那么就完成了。
如果a有列表、自定义对象、集合和其他内容,那么你需要一个deepcopy()

from copy import deepcopy
b = deepcopy(a)

它将复制,并递归地创建其中所有内容的副本

相关问题