原帖作者正在尝试编写一个简单的文本纸牌游戏,它使用从两个.txt文件中上传的卡组。游戏的大致结构如下:
import random
def shuffle(board1):
def 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()
作者表示,他遇到了一个问题,即在game()函数中对board列表进行赋值时遇到了错误。
- 解决方案
变量作用域
在Python中,变量的作用域决定了该变量可以在程序的哪些部分被访问和修改。变量的作用域范围从其声明处开始,一直持续到其作用域的结束。
全局变量
当变量在函数外声明时,它成为全局变量,这意味着它可以在程序的任何地方被访问和修改。
局部变量
当变量在函数内声明时,它成为局部变量,这意味着它只能在该函数内被访问和修改。
问题的原因
board变量在game()函数之外被声明为全局变量,但作者在game()函数内对其进行了赋值,这导致了错误,因为此时board变量在game()函数内是局部变量,而局部变量不能在被声明之前使用。
解决方案
要解决这个问题,作者需要在game()函数内对board变量进行声明,使其成为局部变量,然后再对其进行赋值。
def game():
board=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
board[0]=20
board[10]=20
通过这种方式,board变量在game()函数内成为局部变量,并且在使用之前已对其进行了声明,因此就不会再出现错误。
关于赋值运算符=
作者还询问了如何在Python中获取C++中=赋值运算符的功能,以便在上传卡组后立即完成upload()函数。
=赋值运算符的功能是将右边的值赋给左边的变量。在Python中,=赋值运算符具有与C++中相同的语义。
列表复制
在Python中,=赋值运算符默认情况下对列表进行引用赋值,这意味着它将右边的列表的引用赋给左边的变量。
deck1 = [1, 2, 3]
deck2 = deck1
deck2[0] = 4
print(deck1) # [4, 2, 3]
在上面的示例中,deck2变量被赋值为deck1变量的引用,因此deck2和deck1指向同一个列表。当我们修改deck2中的元素时,deck1中的元素也会随之改变。
如果我们想创建一个deck1列表的副本,而不是引用,我们可以使用copy()函数。
deck1 = [1, 2, 3]
deck2 = deck1.copy()
deck2[0] = 4
print(deck1) # [1, 2, 3]
在上面的示例中,我们使用copy()函数创建了deck1列表的副本,因此deck2和deck1指向不同的列表。当我们修改deck2中的元素时,deck1中的元素不会随之改变。
使用copy()函数
作者可以使用copy()函数来创建一个deck1和deck2列表的副本,以便在上传卡组后立即完成upload()函数。
def upload(deckname):
# uploads cards from file
deck = []
# ...
return deck.copy()
deckname1 = input("\nWhat is the name of deck 1?")
deckname2 = input("\nWhat is the name of deck 2?")
deck1 = upload(deckname1)
deck2 = upload(deckname2)
board[1] = deck1
board[11] = deck2
通过这种方式,deck1和deck2列表的副本被赋予board列表的第1项和第11项,因此board列表中的元素不会受到deck1和deck2列表的修改的影响,并且upload()函数可以在上传卡组后立即完成。