问题是这样的:
image = 'image_name'
stats = [1,2,3]
team_color = 'red'
character = [image, stats, team_color]
character[1][1] -= 1
print( character, stats )
然后返回
['image_name', [1, 1, 3], 'red'] [1, 1, 3]
问题在于我不想更改列表统计信息,因为我使用它来创建其他字符,因此需要保持不变。我知道一些解决方法,例如使用类似这样的代码创建一个新列表:
newList = []
for stat in stats:
newList.append( stat )
character = [image,newList,team_color]
但我想知道是否有更简单,更短的方法来解决这个问题。
谢谢!
答案 0 :(得分:2)
只需按list
复制indexing
即可。 list[:]
将复制列表,以便任何更改都不会反映在原始列表中。
character = [image, stats[:], team_color]
character[1][1] -= 1
print( character, stats )
(['image_name', [1, 1, 3], 'red'], [1, 2, 3])
答案 1 :(得分:1)
要制作某些列表的副本,您可以使用切片操作:
orig_list = [1, 2, 3, 4]
copy_list = orig_list[:]
print(orig_list, copy_list) # [1, 2, 3, 4] [1, 2, 3, 4]
orig_list[0] = 42
print(orig_list, copy_list) # [42, 2, 3, 4] [1, 2, 3, 4]
答案 2 :(得分:1)
在Python中,列表是一个可变对象,因此任何指向该对象的变量都会看到任何变化,无论它何时被修改。
你可以通过这样一个简单的程序看到这个:
>>> a = [1, 2, 3]
>>> b = a
>>> b.append(4)
>>> print(a)
[1, 2, 3, 4]
可以看出, a 引用的列表已被更改,因为它是与 b 引用的列表相同的列表对象。
因此,为了创建一个不会影响原始列表的新列表,您需要在创建字符的位置复制 stats 列表列表。最简单的方法是使用切片表示法的形式来创建新副本:
>>> a = [1, 2, 3]
>>> b = a[:]
>>> b.append(4)
>>> print(a)
[1, 2, 3]
>>> print(b)
[1, 2, 3, 4]
所以适合您的情况:
>>> image = 'image_name'
>>> stats = [1, 2, 3]
>>> team_colour = 'red'
>>> character = [image, stats[:], team_colour]
>>> character[1][1] -= 1
>>> print(character)
['image_name', [1, 1, 3], 'red']
>>> print(stats)
[1, 2, 3]
或者,将它传递给list(),或者使用副本库中的copy.copy(),也会返回列表的副本,但切片表示法可能是最简单的!
最后,类似的东西也可以通过类来实现,因此在实例化角色时你不需要使用切片表示法:
>>> class Character(object):
... def __init__(self, image, stats, team_colour):
... self.image = image
... self.stats = stats[:] # Without the slice you will still reference the original list here!
... self.team_colour = team_colour
>>> image = 'image_name'
>>> stats = [1, 2, 3]
>>> team_colour = 'red'
>>> fred = Character(image, stats, team_colour)
然后,您还可以更明确地更改属性:
>>> fred.stats[1] -= 1
>>> print(fred.stats)
[1, 1, 3]
>>> print(stats)
[1, 2, 3]