# some dict
d_init = {'a': 'a_value', 'b': 'b_value', 'c': 'c_value'}
# class 1
class Store1:
def __init__(self, input_dict):
self.class_dict = input_dict
# class 2
class Store2:
def __init__(self, input_dict):
self.res = []
self.class_dict = input_dict
self.class_list = [self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]
obj1 = Store1(d_init)
print("iter 1 = ", [obj1.class_dict[k] for k in obj1.class_dict.keys()])
obj2 = Store2(d_init)
print("iter 2 = ", obj2.class_list)
输出:
iter 1 = ['a_value', 'b_value', 'c_value']
iter 2 = [None, None, None]
期望输出:
iter 1 = ['a_value', 'b_value', 'c_value']
iter 2 = ['a_value', 'b_value', 'c_value']
self.class_list = [self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]
这里的这个只会附加self.res,所以你应该返回self.res并删除class_list,或者删除self-res并将代码更改为
self.class_list = [self.class_dict[k1] for k1 in self.class_dict.keys()]
# class 2
class Store2:
def __init__(self, input_dict):
self.class_dict = input_dict
self.class_list = [self.class_dict[k1] for k1 in self.class_dict]
# or
self.class_list = list(self.class_dict.values())
您误解了列表理解-
self.class_list = [self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]
这将在self.class_list
内存储.append
的结果的列表(并且.append
显然将返回None
(。实际值会按照您的命令附加到self.res
。如果您打印obj2.res
,您就会得到所需的结果。
如果您希望dict值在class_list
中,为什么要附加到一个完全不同的列表中?为什么不只是
self.class_list = [self.class_dict[k1] for k1 in self.class_dict.keys()]
更好的是,所有这些从dict中获取值的列表理解都可以很容易地简化为-
list(self.class_dict.values())
或者如果你喜欢打高尔夫球-
[*self.class_dict.values()]
简短回答:
更改
print("iter 2 = ", obj2.class_list)
更好的答案:
print("iter 2 = ", obj2.res)
当您使用列表理解,并使用迭代的返回值在内部执行方法时。它留下了None数据类型,因为您将输出转移到了Store2类的self.res。因此,[无,无,无]。要使self.class_list等于self.res,可以这样做。。
# class 2
class Store2:
def __init__(self, input_dict):
self.res = []
self.class_dict = input_dict
## run the list comp. after setup of 'res' and 'class_dict'
[self.res.append(self.class_dict[k1]) for k1 in self.class_dict.keys()]
## the local scope of class [None, None, None] value, will be trashed
## thanks python, for the dynamic cleanup :D
self.class_list = self.res.copy()
obj2 = Store2(d_init)
print("iter 2 = ", obj2.class_list)
输出
iter 2 = ['a_value', 'b_value', 'c_value']