我的目标是动态获取名为递归的对象列表。这是我试过的代码。
我希望AppleStrawberryBananaCitrusOrange
yBan
ApyBanpleSyBantrawberryBananaCitrusOrange
为object_list
[Object_0, Object_1, Object_2, Object_3, Object_4]
这是错误:
object_list = []
class Object(object):
size = ""
price = ""
def create_object_list(object_list):
for num in range(5):
Object_%s = Object() %num
object_list.append(Object_%s)
return object_list
答案 0 :(得分:0)
看过页面上的评论后,真正的答案是只使用一个列表,不要尝试给对象名称来表示它们在列表中的位置。你要做的是反模式。您无需设置对象的“名称”,就像您想要访问np.delete
一样,您可以通过object_n
获取该名称。此外,您可以简单地使用objects[n]
或namedtuple
代替自定义类。
dict
对于问题中的具体错误:
您不能在变量名称中使用from random import random
objects = []
for i in range(5):
obj = {'size': random(), 'price': random()}
objects.append(obj)
print(objects[0])
print(objects[3]['size'])
print(objects[1]['price'])
,因为它是operator。请参阅此处了解您可以在名称中使用的内容:
https://docs.python.org/2/reference/lexical_analysis.html#identifiers
%
您的问题中的代码中还有其他几个问题可能会让您感到困惑:
>>> variable_name = 1
>>> variable_%name = 2
File "<input>", line 1
SyntaxError: can't assign to operator
>>>
有类变量,而不是实例变量。答案 1 :(得分:0)
你的意思是:
exec("Object_%s = Object()" %num)
exec("object_list.append(Object_%s)" %num)
因为否则看起来你正在尝试格式化代码而不是字符串。 这是你代码中明显的错误 - 但除此之外我必须同意所有其他错误 - 如果你没有充分的理由创建变量 - 只需使用一个dic。
答案 2 :(得分:0)
我想你想要一个object_dict
:
object_dict = {}
class Object(object):
size = ""
price = ""
def create_object_list(object_dict):
for num in range(5):
object_dict["Object_{}".format(num)] = Object()
return object_dict
如果由于某种原因需要订购,请使用collections.OrderedDict:
from collections import OrderedDict
object_dict = OrderedDict()
将保持创建对象的顺序:
OrderedDict([('Object_0', <__main__.Object object at 0x7f05d4044390>), ('Object_1', <__main__.Object object at 0x7f05d3fd3710>), ('Object_2', <__main__.Object object at 0x7f05d3fd36d8>), ('Object_3', <__main__.Object object at 0x7f05d3fd3a90>), ('Object_4', <__main__.Object object at 0x7f05d273a278>)])
您可以按键访问每个对象:
print(object_dict["Object_0"])
<__main__.Object object at 0x7f05d4044390>
答案 3 :(得分:0)
您正在尝试动态创建不可能的变量名称。 %
运算符仅适用于字符串而非标识符。你可能想在这里使用字符串列表。
如果您真的想要动态创建新变量,可以使用包含局部变量字典的locals()
内置函数。例如,您可以使用locals()['object_%d' % num] = Object()
。如果要创建全局变量,可以使用globals()
函数。
请注意,即使您这样做,在打印列表时也无法获得变量名称列表;你会得到一个价值清单。
答案 4 :(得分:0)
另一种方法:
class Object(object):
def __init__(self, inst_id):
self.name = "Object_%d" % inst_id
self.size = ""
self.price = ""
def create_object_list(object_list):
for num in range(6):
object_list.append(Object(num))
return object_list
for x in create_object_list(object_list):
print x.name
Object_0
Object_1
Object_2
Object_3
Object_4
Object_5
答案 5 :(得分:0)
假设您有以下五个变量:
a = (1,2,3)
e = "a string"
i = 1.56
o = {'size':'small', 'price':'low'}
u = None
以及将它们分组的列表:
them = [a,e,i,o,u]
您可以通过这种方式创建此列表:
same = [eval(_) for _ in 'aeiou']
print(same)
# [(1, 2, 3), 'a string', 1.56, {'price': 'low', 'size': 'small'}, None]
因此,您需要创建的变量列表可以采用相同的方式完成:
object_list = [eval('Object_'+str(n)) for n in range(5)]
如果对象已经存在,你可以使用列表中的变量,但是为了自己创建变量,你可以这样做:
for _ in ('Object_'+str(n)+'=None' for n in range(5)): # or '=...' any appropriate value
exec(_) # it could be a call to your Object()
print(objcet_list)
# [None, None, None, None, None]