2017-06-24 1 views
0

Pourquoi inventory[dragon_loot[n]] == inventory[added_items[n]], dans les codes suivants?Paramètre ou argument dans la fonction

def display_inventory(inventory): 
    print('Inventory:') 
    items = 0 
    for k, v in inventory.items(): 
     print(str(v) + ' ' + str(k)) 
     items += v 
    print('Total number of items: ' + str(items)) 


def add_to_inventory(inventory, added_items): 
    for n in range(len(added_items)): 
     inventory.setdefault(added_items[n], 0) 
     inventory[dragon_loot[n]] += 1 ----> # or 'inventory[added_items[n]] += 1' the same effect 
    return display_inventory(inventory) 


stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12} 
dragon_loot = ['rope', 'gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 

add_to_inventory(stuff, dragon_loot) 
+0

J'ai lu et lu, mais je ne peux vraiment trouver votre question ici :(, pourriez-vous être plus clair s'il vous plaît ce qui est bien votre question quel est le problème –

+1

demandons pourquoi vous? inventory [dragon_loot [n]] == inventory [added_items [n]]? – JohnDoe

+0

Oui, ça l'est, je ne sais pas comment ils sont équivalents. – Tuto

Répondre

0

Il semble que vous soyez un peu confus sur la façon dont les arguments/paramètres sont transmis.

Jetez un coup d'œil à cet exemple.

def my_func(copy_var): 
    #copy_var=1 
    print(copy_var) 
    print(hex(id(copy_var))) 
var=1000 
print(var) 
print(hex(id(var))) 
print("----------------------") 
my_func(var) 

sortie:

1000 
0x7efd723d9b70 
---------------------- 
1000 
0x7efd723d9b70 

Remarque: hex (id (variable)) retourne simplement l'adresse de la mémoire de la valeur stockée dans une variable

Remarquez comment la les adresses sont les mêmes. Désigne à la fois la variable locale (qui est locale uniquement pour la fonction) et la variable globale pointant vers la même adresse.

Cependant, la portée de copy_var est seulement dans cette fonction. Lorsque vous essayez d'y accéder à l'extérieur. L'erreur est levée.

Jetez un coup d'œil à celui-ci.

def my_func(copy_var): 
    print(copy_var) 
var=1000 
print(var) 
print("------------------------") 
my_func(var) 
print(copy_var) 

sortie:

1000 
------------------------ 
1000 
Traceback (most recent call last): 
    File "/home/mr/argfunc.py", line 7, in <module> 
    print(copy_var) 
NameError: name 'copy_var' is not defined 

maintenant aussi simple que je peux mettre,

def my_func(copy_var): 
    print(copy_var) 
    print(var) 
var=1000 
print(var) 
my_func(var) 

Les deux copy_var et var ont la même valeur indiquant même adresse. Mais la face est dans la fonction tandis que l'autre est globale.

Notez comment les deux (copy_var et var) impriment la même valeur 1000. C'est exactement ce qui se passe dans votre code confus.

Pour en revenir à votre, puisque dans cette ligne

add_to_inventory(stuff, dragon_loot) 

dragon_loot est donnée à fonctionner comme added_items donc à la fois le point même adresse ayant les mêmes valeurs. Mais la seule différence est que leurs champs d'application sont différents.

dragon_loot -?>added_items