首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >多维python列表元素赋值错误

多维python列表元素赋值错误
EN

Stack Overflow用户
提问于 2018-06-28 07:01:59
回答 2查看 67关注 0票数 0

我正在定义一个维度为n,m的类游戏。init方法创建两个棋盘,每个玩家一个棋盘

代码语言:javascript
复制
class game:

def __init__(self, n, m):
    rows = [0 for _ in range m]
    self.board1 = [rows for _ in range n]
    self.board2 = [rows for _ in range n]

当我为board1赋值时,它也会为board11、board12、...board1n以及board20-n赋值

例如,

代码语言:javascript
复制
game(3,4)
game.board1[0][0] = 1
print("board 1: {}\nboard 2: {}).format(self.board1, self.board2))

返回

代码语言:javascript
复制
board 1: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
board 2: [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-28 07:27:41

首先是一些有效的代码:

代码语言:javascript
复制
class game:

def __init__(self, n, m):
    self.board1 = [ [0]*m for _ in range(n) ]
    self.board2 = [ [0]*m for _ in range(n) ]

new_game = game(3,4)
new_game.board1[0][1] = 1
print("board 1: {}\nboard 2: {}".format(new_game.board1, new_game.board2))

为什么这能起作用,而不是你写的?因为,当您创建rows = [0 for _ in range m],然后将其传递给不同的板时,它只是将同一对象多次传递给两个板。所以,你的冲浪板不是

代码语言:javascript
复制
[rows1, rows2, rows3]

他们是

代码语言:javascript
复制
[rows, rows, rows]

由于它引用的是相同的对象,所以当您修改其中一个对象时,您会得到反射过来的相同值。

票数 0
EN

Stack Overflow用户

发布于 2018-06-28 07:21:00

你的代码告诉我们self.board[n] = rows是一个对象。为了节省内存,python不会复制它只能引用的对象。您可以使用id(obj)命令查看它们是否都引用了完全相同的对象。

代码语言:javascript
复制
In [34]: id(game.board1[0])
Out[34]: 4439424520

In [35]: id(game.board1[1])
Out[35]: 4439424520

In [36]: id(game.board2[1])
Out[36]: 4439424520
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51072549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档