En m'enseignant python en ce moment et j'essaye de faire un simple script de paiement, j'ai touché un peu un bloc ici, j'ai essayé d'utiliser une fonction pour construire simple envoi paiement entre deux clients en utilisant la compréhension de la listePython: Changer la valeur d'une instance à partir d'une compréhension de liste
def sendpayment(sender, recipient, amount):
[(print(x.balance - amount),print(y.balance + amount)) for x in Account.accountList
for y in Account.accountList
if x.name == sender and y.name == recipient]
Cela fonctionne bien jusqu'à ce que j'essaie de voir si le nouvel équilibre a été mis à jour pour les deux clients, Comme vous pouvez le voir ci-dessous une fois que je lance A.balance après avoir exécuté la fonction sendpayment, rien ne change sur les deux instances client. Ce que j'espérais réaliser, c'est que l'équilibre des deux attributs change une fois que cette fonction est exécutée.
>>> A = Account("Alice", 100)
>>> B = Account("Bob", 50)
>>> Account.sendpayment("Alice", "Bob", 10)
90
60
>>> A.balance
100
>>> B.balance
50
Voici la suite du code afin que vous obteniez une idée plus large du reste des classes client et compte dans le script.
class Customer:
def __init__(self, name, balance):
self.name = name
self.balance = balance
def __repr__(self):
return repr(self.__dict__)
def __getitem__(self, i):
return getattr(self, i,)
class Account:
accountList = []
def __init__(self, name, balance):
self.customer = Customer(name, balance)
Account.accountList.append(self)
def __repr__(self):
return repr(self.__dict__)
def __getitem__(self, i):
return getattr(self, i)
def __getattr__(self, attr):
return getattr(self.customer, attr)
def sendpayment(sender, recipient, amount):
[(print(x.balance - amount),print(y.balance + amount)) for x in Account.accountList
for y in Account.accountList
if x.name == sender and y.name == recipient]
Pourquoi est-ce que modifier les instances? Vous calculez une nouvelle valeur et l'imprimez, il n'y a pas d'affectation. N'utilisez pas la compréhension des listes pour les effets secondaires, utilisez simplement les boucles 'for' normales. – jonrsharpe
J'ai peut-être pensé à tort que la compréhension est en train de gérer le devoir, je pensais que tout ce que vous pouviez faire dans une boucle for que vous pourriez faire dans une liste de compréhension? – cyclopse87
Non seulement il y a des choses que vous ne pouvez pas faire, mais il y en a d'autres que vous ne devriez pas faire! Un comp liste est un bon remplacement pour beaucoup de 'append's, mais il y a beaucoup de choses qui ont plus de sens que les boucles conventionnelles. – jonrsharpe