首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python变化莫测?

Python变化莫测?
EN

Stack Overflow用户
提问于 2010-09-01 14:52:58
回答 5查看 4.2K关注 0票数 7

我的Python变量是怎么回事?old_pos似乎被链接到pos

代码:

代码语言:javascript
运行
复制
pos = [7, 7]
direction = [1, 1]
old_pos = pos
print 'pos     = '+str(pos)
print 'old_pos = '+str(old_pos)
pos[0] += direction[0]
pos[1] += direction[1]
print 'pos     = '+str(pos)
print 'old_pos = '+str(old_pos)

输出:

代码语言:javascript
运行
复制
pos     = [7, 7]
old_pos = [7, 7]
pos     = [8, 8]
old_pos = [8, 8]

但是,如果我将old_pos = pos替换为old_pos = tuple(pos)甚至old_pos = list(pos),我就不会遇到这样的问题:

代码语言:javascript
运行
复制
pos     = [7, 7]
old_pos = [7, 7]
pos     = [8, 8]
old_pos = [7, 7]
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-01 14:55:56

当您说old_pos = pos时,您不是在创建pos的副本,而是对同一个列表进行另一次引用。如果您想要两个独立运行的列表,您将需要创建一个副本,比如使用您提到的list(pos)函数,或者使用片表示法pos[:]

票数 13
EN

Stack Overflow用户

发布于 2010-09-01 15:36:07

old_pos = pos不创建名称pos引用的对象的副本,而是创建另一个名为old_pos的引用,该引用指向同一个对象。对pos执行的操作会影响old_pos引用的同一个对象。同样,“史蒂文”和“伦巴斯基先生”这两个名字都是指我。如果你打史蒂文的脸,伦巴斯基先生就会受伤,因为这两个名字指的是同一个对象--我。

这里有三种方法来制作一个实际的副本,而不是第二个引用:

使用切片符号

代码语言:javascript
运行
复制
old_pos = pos[:]

使用列表构造函数

代码语言:javascript
运行
复制
old_pos = list(pos)

使用复制模块

代码语言:javascript
运行
复制
from copy import copy
old_pos = copy(pos)

请注意,这些副本都是浅拷贝,在本例中是可以的。要了解浅拷贝和深拷贝之间的区别,请阅读副本模块的文档

票数 7
EN

Stack Overflow用户

发布于 2010-09-01 14:56:08

old_pos似乎与pos有关联

正确-这个:

代码语言:javascript
运行
复制
old_pos = pos

使old_pospos指向相同的列表。它不会创建pos的新副本。

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

https://stackoverflow.com/questions/3619368

复制
相关文章

相似问题

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