变量分配错误

时间:2015-11-18 14:50:52

标签: python python-2.7 variables python-3.x

问题是这样的:

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]

但我想知道是否有更简单,更短的方法来解决这个问题。

谢谢!

3 个答案:

答案 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]