首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用追加方法的Python浅拷贝和深拷贝

使用追加方法的Python浅拷贝和深拷贝
EN

Stack Overflow用户
提问于 2016-11-04 14:47:34
回答 1查看 10.7K关注 0票数 9

在python3.5中使用附加法时出现了一些问题。给出了代码。

代码语言:javascript
运行
复制
# generate boson basis in lexicographic order
def boson_basis(L,N):
basis=[]
state=[0 for i in range(1,L+1)]
pos=0
# initialize the state to |N,0,...,0>
state[0]=N
basis.append(state)
# find the first non-zero position in reverse order
while state[L-1]<N:
    for i in range(-2,-L-1,-1):
        if state[i]>0:
            pos=L+i
            break
    sum=0
    for i in range(0,pos):
        sum=sum+state[i]
    state[pos]=state[pos]-1
    state[pos+1]=N-sum-state[pos]
    basis.append(state)
return basis        

result=boson_basis(3,3)

预期的结果应该是[[3,0,0],[2,1,0],...,[0,0,3]],但是这段代码生成错误的结果,所有元素都与最后一个相同,即[[0,0,3],...,[0,0,3]]。我使用pdb来调试它,我发现一旦修改了state,添加到basis中的前一个state也会同时发生变化。这意味着append自动使用deepcopy,这超出了我的理解。事实上,如果我们显式地使用basis(state.copy()),这个错误是可以修复的。

另一方面,下面的简单代码显示在使用append时没有错误

代码语言:javascript
运行
复制
x=3
b=[]
b.append(x)
x=x+2

x更改为x=5后,b保持不变的b=[3]。这确实令我困惑,似乎与前一个例子相矛盾。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-04 15:01:44

正如评论中所揭示的,在append操作中没有任何副本。因此,您必须亲自显式地处理这一问题,例如通过替换

代码语言:javascript
运行
复制
basis.append(state)

使用

代码语言:javascript
运行
复制
basis.append(state[:])

使用:的切片操作创建了state的副本。注意:它不会复制列表元素--只要您只保留简单的数字,而不是列表中的对象,就可以了。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40425554

复制
相关文章

相似问题

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