如何通过组合整数和字符串来创建变量?
我想通过某种循环来创建变量,也就是说我想给变量起名字,比如叫“t1
”、“t2
”、“t3
”等等。我该怎么做呢?
i = 1
while 1:
("t" + str(i)) = [0,0,0,0]
i = i + 1
看起来这样做是可以的。(保持str("t")
在前面,然后把第二个字符改成变化的int(i)
。这样做是为了创建变量,之后可以把它们放进一个数组里,而不需要在代码中一个个写出来。)我想做一个包含10,000个列表的列表,每个列表里有4个元素。这样说清楚了吗?
3 个回答
3
t = [[0] * 4] * 10000
这个写法是可以的,但可能不是你想要的效果。它并不是创建一个包含10000个列表的列表,而是创建了一个包含10000个对同一个列表的引用的列表。当你尝试修改里面的某些元素时,看看会发生什么:
>>> t = [[0] * 4] * 3
>>> t
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> t[0][0] = 1
>>> t
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
其实,你可能更希望这样做:
>>> t = [[0] * 4 for _ in xrange(3)]
>>> t
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> t[0][0] = 1
>>> t
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
原因在于,乘法操作只是让列表变得更长,但里面的元素仍然指向原始列表中的同一份内容。除非你确定这个列表里面的元素都是不可变的(比如数字和字符串),否则这样做几乎总是不明智的。因此,在我的回答中,[0] * 4
这种写法是可以的,但像 [[0] * 4] * 10000
这样的外层列表乘法就很危险。
5
别尝试了。
相反,使用一个字典来保存所有的值——你的标题可以作为键:
my_dict = {}
for i in range(1, 4):
my_dict['t%s' % i] = foo
5
虽然从技术上讲,你想做的事情是可以实现的,但这其实是个很糟糕的做法。你要做的正是列表(或者说数组)的用武之地,所以在这里你应该使用列表。
根据你提供的代码示例,像下面这样的代码
t = [[0] * 4 for i in xrange(10000)]
(正如David Alber在评论中提到的)应该可以满足你的需求;它会创建一个包含10000个列表的列表,每个列表里有4个元素。
附注:在Python 3中,xrange
这个函数已经改名为range
。