I am working on a card game project that is a similar concept to Hearthstone's Battlegrounds mode (for practice, and fun). I am trying to put two or more of the same card in the players hand and then modify its values individually. Currently, when one card is supposed to be modified, it changes both.

First, I bring in the monsters json and deepcopy it into a list so I can 1) modify the entries and 2) keep a reference for the original values:

```
gameDeck = []
with open('monsters.json', 'r') as f:
    monsters = json.load(f)
gameDeck = copy.deepcopy(monsters)

```

An example of a monster entry (it is a dictionary within a list):

```
[
  { "name": "Jerry",
    "hp": 1,
    "str": 1,
    "type": "human",
    "amount": 10,
    "ability": "",
    "ability-property":"",
    "ability-property-amount":""
  },

```

I then add the card to the users hand (by force, for testing):

```
def forceAssignUser(user, gameDeck):
    user.addCard(card, gameDeck)
    user.addCard(card, gameDeck)

```

.addCard looks like:

```
class Player:
    #...

    # adds a card to the players hand, removes the card from the deck
    def addCard(self, card, gameDeck):
        self.hand.append(card)
        # gameDeck.remove(card)
        card['amount'] -= 1

```

Now of course, when running and during 'combat' phase, when one card takes damage, so does it's duplicate. I tried this but ended up the same result:

```
def forceAssignUser(user, gameDeck):
    card = copy.deepcopy(gameDeck[0])
    user.addCard(card, gameDeck)
    user.addCard(card, gameDeck)

```

Here is what a part of the 'combat' phase looks like, where most of the changes happen (not pretty, I know):

```
    while userAlive is not False and opponentAlive is not False:
        if whoseTurn == "u":
            if userMonAtk >= len(user.hand):
                #what monster will attack
                userMonAtk = 0
            while checkCardHealth(user, userMonAtk) <= 0:
                #use next monster if current is dead
                userMonAtk += 1
            #choose a random target
            randOpponentMon = random.randint(0, len(user.hand) - 1)
            while opponent.hand[randOpponentMon]['hp'] <= 0:
                #reroll if chosen enemy dead
                randOpponentMon = random.randint(0, len(user.hand) - 1)
            usMonster = user.hand[userMonAtk] #store the card info
            opMonster = opponent.hand[randOpponentMon]
            opMonster['hp'] -= usMonster['str'] #when attacking or being attacked, take damage
            usMonster['hp'] -= opMonster['str']
            printBoard(user, opponent)
            print("Your {0} attacks opponent's {1}!".format(usMonster['name'], opMonster['name']))
            opponentAlive = checkDeckHealth(opponent)
            userAlive = checkDeckHealth(user)
            input("Press anything to continue.")
            whoseTurn = "o"
            userMonAtk += 1

```

Is it even possible to do what I am trying to do? I am not amazing at coding, so a lot of my code revolves around logic, methods, and a class.