今天我在添加 python 列表时遇到了一个相当奇怪的问题。我试图创建一个数组,其每个元素都像 C
struct
。其中一个元素本身就是一个列表。这是有问题的代码:
class players:
name='placeholder'
squad=list()
teams=list()
teams.append(players())
teams.append(players())
teams[0].name="abc"
teams[1].name="xyz"
teams[0].squad.append("Joe")
for w in teams:
print(w.name)
print(w.squad)
我期望的输出是:
abc
['Joe']
xyz
[]
因为我只为团队[0]添加了一名成员到
squad
。但我得到的输出是:
abc
['Joe']
xyz
['Joe']
名称设置得很好,但
.append
将其附加到teams
的两个元素!
造成此问题的原因是什么以及如何解决此问题?
原因是在类定义中,
squad
和name
是类变量,而不是实例变量。当初始化一个新的 player
对象时,它本质上是在播放器的所有实例中共享相同的 squad
变量。相反,您希望为 __init__
类定义一个 player
方法,显式分隔特定于实例的变量。
class players:
def __init__(self):
self.name = 'placeholder'
self.squad = []
然后,当您初始化新的
player
对象时,它就有自己的 squad
变量。您的代码的其余部分现在应该可以正常工作,只需附加正确的对象的 squad
。
这是完整的代码[正确的]
class players:
def __init__(self):
self.name = 'placeholder'
self.squad = []
teams = []
teams.append(players())
teams.append(players())
teams[0].name = "abc"
teams[1].name = "xyz"
teams[0].squad.append("Joe")
for w in teams:
print(w.name)
print(w.squad)