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

56 阅读4分钟

原帖作者正在尝试编写一个简单的文本纸牌游戏,它使用从两个.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列表进行赋值时遇到了错误。

  1. 解决方案

变量作用域

在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变量的引用,因此deck2deck1指向同一个列表。当我们修改deck2中的元素时,deck1中的元素也会随之改变。

如果我们想创建一个deck1列表的副本,而不是引用,我们可以使用copy()函数。

deck1 = [1, 2, 3]
deck2 = deck1.copy()

deck2[0] = 4

print(deck1)  # [1, 2, 3]

在上面的示例中,我们使用copy()函数创建了deck1列表的副本,因此deck2deck1指向不同的列表。当我们修改deck2中的元素时,deck1中的元素不会随之改变。

使用copy()函数

作者可以使用copy()函数来创建一个deck1deck2列表的副本,以便在上传卡组后立即完成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

通过这种方式,deck1deck2列表的副本被赋予board列表的第1项和第11项,因此board列表中的元素不会受到deck1deck2列表的修改的影响,并且upload()函数可以在上传卡组后立即完成。