在 Python 中将列表作为参数传递给类
Passing a List as an argument to a Class in Python
将列表作为参数传递给类:
- 在实例化类时将列表作为参数传递。
- 将列表分配给
__init__()
方法中的实例变量。 - 您可以访问类实例的列表。
主程序
class Employee(): def __init__(self, name, tasks): self.name = name self.tasks = tasks def add_tasks(self, task): self.tasks.append(task) return self.tasks bob = Employee('Bobbyhadz', ['develop', 'test']) print(bob.tasks) # 👉️ ['develop', 'test'] bob.add_tasks('ship') print(bob.tasks) # 👉️ ['develop', 'test', 'ship']
该类的__init__()
方法采用一个tasks
列表。
这个参数应该在我们实例化Employee
类的任何时候传递。
我们在方法中声明的变量__init__()
称为实例变量。
实例变量对于您通过实例化类创建的每个实例都是唯一的。
主程序
class Employee(): def __init__(self, name, tasks): self.name = name self.tasks = tasks def add_tasks(self, task): self.tasks.append(task) return self.tasks alice = Employee('Alice', ['design', 'ship']) print(alice.tasks) # 👉️ ['design', 'ship'] bob = Employee('Bobbyhadz', ['develop', 'test']) print(bob.tasks) # 👉️ ['develop', 'test']
注意类型参数list
是通过引用传递的,而不是通过值传递的。
主程序
class Employee(): def __init__(self, name, tasks): self.name = name self.tasks = tasks def add_tasks(self, task): self.tasks.append(task) return self.tasks list_of_tasks = ['design', 'test'] alice = Employee('Alice', list_of_tasks) bob = Employee('Bobbyhadz', list_of_tasks) # 👇️ add item to the list of one instance alice.add_tasks('ship') print(alice.tasks) # 👉️ ['design', 'test', 'ship'] print(bob.tasks) # 👉️ ['design', 'test', 'ship']
我们在创建两个实例时传递的列表指的是同一个对象。该对象指向内存中的相同位置。
当我们使用一个实例将任务添加到列表时,更改会反映在另一个实例中。
解决这个问题的一种方法是在将列表作为参数传递给类时创建列表的浅表副本。
主程序
class Employee(): def __init__(self, name, tasks): self.name = name self.tasks = tasks def add_tasks(self, task): self.tasks.append(task) return self.tasks list_of_tasks = ['design', 'test'] alice = Employee('Alice', list_of_tasks.copy()) bob = Employee('Bobbyhadz', list_of_tasks.copy()) alice.add_tasks('ship') print(alice.tasks) # 👉️ ['design', 'test', 'ship'] print(bob.tasks) # 👉️ ['design', 'test']
list.copy方法返回调用该方法的对象的浅表副本。
您还可以在类的__init__()
方法中为列表使用默认参数。
主程序
class Employee(): # 👇️ default argument of None def __init__(self, name, tasks=None): self.name = name if tasks is None: tasks = [] self.tasks = tasks def add_tasks(self, task): self.tasks.append(task) return self.tasks alice = Employee('Alice') bob = Employee('Bobbyhadz') print(bob.tasks) # 👉️ [] bob.add_tasks('develop') print(bob.tasks) # 👉️ ['develop'] print(alice.tasks) # 👉️ []
None
我们为tasks
变量使用了默认值。
如果没有传递参数,我们将初始化tasks
为一个空列表。
这很有用,因为为tasks
变量使用空列表的默认参数会引入多个实例引用同一个列表的问题。
主程序
class Employee(): # ⛔️ BAD - using empty list default argument def __init__(self, name, tasks=[]): self.name = name self.tasks = tasks def add_tasks(self, task): self.tasks.append(task) return self.tasks alice = Employee('Alice') bob = Employee('Bobbyhadz') bob.add_tasks('develop') print(bob.tasks) # 👉️ ['develop'] print(alice.tasks) # 👉️ ['develop']
请注意,在一个实例中将值添加到tasks
列表也会将该值添加到另一个实例中的列表。
这是因为tasks
实例变量指向两个实例的相同列表(内存中的相同位置)。
None
您可以像我们在前面的示例中那样使用默认值来解决这个问题。