如何通过组合整数和字符串来创建变量?

1 投票
3 回答
888 浏览
提问于 2025-04-17 06:18

我想通过某种循环来创建变量,也就是说我想给变量起名字,比如叫“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

撰写回答