如何理解这一句 Python 的赋值语句?

2016-08-22 19:56:18 +08:00
 jmyz0455

self.agent_stats = [[0, 0, 0] for a in self.agents]

在阅读别人代码的时候看见的,请问这是什么意思?

4671 次点击
所在节点    Python
31 条回复
cartmanie
2016-08-23 12:15:31 +08:00
>>> a=[1,2,3]
>>> b=[[0,0,0] for c in a]
>>> print b
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
qnnnnez
2016-08-23 12:16:29 +08:00
@introom 反对,和是不是 immutable 没有关系

a = [1]
b = a, a, a, a, a
c = [b] * 5
print(c)
a[0] = 2
print(c)
shyling
2016-08-23 12:41:10 +08:00
你需要[([0]*3)[:] for _ in range(10)]
hitmanx
2016-08-23 14:20:15 +08:00
@qnnnnez 涉及到显式拷贝的比较好辨认,包括函数传参。但是像这个*,第一反应没想到是个拷贝动作。

如果在 c++里,给我的感觉可能类似
const size_t len = 5;
std::vector<std::vector<int> > vec(len, std::vector<int>(3, 0));
allanzyne
2016-08-23 15:06:34 +08:00
@shyling [:] 没有必要吧?
shyling
2016-08-23 15:12:10 +08:00
@allanzyne 需要 0 0
allanzyne
2016-08-23 15:14:48 +08:00
@shyling 我测了一下,好像和没写一样啊?
shyling
2016-08-23 15:15:09 +08:00
@allanzyne 哦,不需要,记错了
gkiwi
2016-08-24 08:51:21 +08:00
@qnnnnez

你的姿势不对,后面的 b,c 引用的都是[0]这个 list 的地址,而 list 是 muatble 的;

你试试这个:

a = 1
b = a, a, a, a, a
c = [b] * 5
print(c)
a = 2
print(c)

http://blog.csdn.net/hsuxu/article/details/7785835
qnnnnez
2016-08-24 11:53:40 +08:00
@gkiwi 仔细想想,我发现应该是“不包含 mutable 对象的 immutable 对象”
Yinz
2016-08-25 00:13:37 +08:00
学习了:D

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/301027

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX