Python赋值运算符、函数定义和变量定义

Python赋值运算符、函数定义和变量定义,python,function,python-3.x,assignment-operator,Python,Function,Python 3.x,Assignment Operator,嗯。。。我在让我的部分代码正常工作时经历了一段糟糕的时光,但我重新安排了事情,它突然开始正常工作。老实说,我不知道我做了什么,所以我想这将是这个问题的主题。我正在构建一个简单的基于文本的纸牌游戏,它使用从两个.txt文件上传的牌组。它的目标是魔术:聚会,但如果人们有创意的话,它可能会与其他人合作。为了提供一个粗略的概述,以下是事情的安排方式: import random def shuffle(board1): def game(): #board=[[],[],[],[],[],[

嗯。。。我在让我的部分代码正常工作时经历了一段糟糕的时光,但我重新安排了事情,它突然开始正常工作。老实说,我不知道我做了什么,所以我想这将是这个问题的主题。我正在构建一个简单的基于文本的纸牌游戏,它使用从两个.txt文件上传的牌组。它的目标是魔术:聚会,但如果人们有创意的话,它可能会与其他人合作。为了提供一个粗略的概述,以下是事情的安排方式:

import random

def shuffle(board1):

def game():
    #board=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
    #performs most of the actions relating to the game
    board[0]=20
    board[10]=20


def gameboard(board2):
    #displays game board

def draw(board3, numcards, player):
    #draws cards

def upload(deckname):
    #uploads cards from file

def life(board4):
    #asks about which player the life total is changing on, by how much, etc.
    #and then does it

def maketoken(board5):
    #creates tokens, counters, etc. based on user input

def move(board5):
    #accepts user input and moves cards from zone to zone

def play(board6):
    #handles casting spells, using abilities, triggered abilities, etc.

#main body of program is below function definitions

board=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]

deckname1=input("\nWhat is the name of deck 1?")
deckname2=input("\nWhat is the name of deck 2?")

deck1=upload(deckname1)
deck2=uplaod(deckname2)

board[1]=deck1
board[11]=deck2

#this is where a lot of the other variables get set
game()
(注意:由于我的代码非常难看,为了简洁美观,大部分代码都被删除了)

我有一个大学级C++背景,最近决定选择You-OLED键盘来解决问题,所以分配操作员(不)按我预期的方式工作,这让我发疯。因此,我还想知道是否有一种方法可以在Python中获得C++ ''= '的功能,因为我从.txt文件上传了这个程序,并且想尽快完成上传()函数(我使用DEKK1=上传(DeNKNAME)(同样适用于DEK2)。.我想在每场比赛结束后使用'deck1'和'deck2'重新填充牌组,但如果我了解'='在python中的工作原理,输入board[1]=deck1意味着board[1]将指向deck1的存储区域,对board[1]的更改将更改deck1,但我不希望这样做…GRRRR!!!!!11)。我肯定有一个解决办法,因为它让我发疯,但我一直没能找到它。谢谢

编辑:这是我以这种方式设置时收到的错误:

Traceback (most recent call last):
  File "C:\Users\inventor487\Desktop\simplepy.py", line 444, in <module>
    game()
  File "C:\Users\inventor487\Desktop\simplepy.py", line 114, in game
    board[1]=deck1
UnboundLocalError: local variable 'board' referenced before assignment
回溯(最近一次呼叫最后一次):
文件“C:\Users\inventor487\Desktop\simplepy.py”,第444行,在
游戏()
文件“C:\Users\inventor487\Desktop\simplepy.py”,第114行,在游戏中
板[1]=甲板1
UnboundLocalError:赋值前引用的局部变量“board”
总结:

  • 我是否需要将board传递给game()函数,即使它被设置为全局变量(或者至少我认为是这样)?当我在game()函数中分配它时,一切似乎都很好(注释掉以显示这一点)。(编辑:没关系……我是个白痴。)
  • 将棋盘的一部分分配给game()中的值是否使其成为局部变量(例如,我的棋盘[0]=20)?(编辑:是的,很明显…)

  • 编辑:一个类可以很容易地解决所有这些问题,而且更干净。每个区域都有一个单独的变量等,这会使一切变得更加平滑。谢谢你们的帮助,伙计们。非常感谢。正如你发现的,Python中的<代码>=/COD>运算符不象C++那样复制对象。如果您想创建一个副本来存储在另一个变量中,您必须明确地说明它

    board[1] = deck1[:]  # the slicing operator copies a subset or the whole list
    
    更通用的方法是使用


    您似乎对作用域、局部作用域(在
    游戏
    中)与全局作用域不同以及Python如何处理边界感到困惑。但是,如果没有更多的信息,我们在这方面帮不了你多少忙。错误是什么?如果你能显示C++代码,它会更容易回答。因此,当您说
    a=b=c=[]
    时,所有这些变量都引用同一个列表对象。当您传递列表/将列表分配给变量/修改列表时,不会产生任何副本。对于您的板,使用列表理解,例如
    board=[[]对于范围(0,22)中的i]
    ,这将使它变得更容易。(编辑:不能计数,希望是对的)。有关如何为问题创建好的示例代码的更多帮助,请参阅。
    import copy
    board[1] = copy.copy(deck1)
    board[1] = copy.deepcopy(deck1)