Python变量奇怪吗?

Zaz*_*Zaz 6 python variables tuples reference list

我的Python变量发生了什么?old_pos似乎与以下内容有关pos:

码:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

pos     = [7, 7]
old_pos = [7, 7]
pos     = [8, 8]
old_pos = [8, 8]
Run Code Online (Sandbox Code Playgroud)

不过,如果我更换old_pos = posold_pos = tuple(pos),甚至old_pos = list(pos),我不明白这个问题:

pos     = [7, 7]
old_pos = [7, 7]
pos     = [8, 8]
old_pos = [7, 7]
Run Code Online (Sandbox Code Playgroud)

rec*_*ive 12

当你说old_pos = pos,你不是创建一个副本pos,而是只是对同一个列表进行另一个引用.如果您想要两个独立运行的列表,则需要进行复制,例如使用list(pos)您提到的函数或使用切片表示法pos[:].


Ste*_*ski 7

old_pos = pos不会创建由名称pos引用的对象的副本,而是创建一个名为old_pos同一对象的第二个引用.为pos影响同一对象所做的操作old_pos.同样,名字"Steven"和"Mr. Rumbalski"都指的是我.如果你把史蒂文打在脸上,Rumbalski先生将受伤,因为这两个名字指的是同一个物体 - 我.

以下是制作实际副本而不是第二个引用的3种方法:

使用切片表示法

old_pos = pos[:]
Run Code Online (Sandbox Code Playgroud)

使用列表构造函数

old_pos = list(pos)
Run Code Online (Sandbox Code Playgroud)

使用复制模块

from copy import copy
old_pos = copy(pos)
Run Code Online (Sandbox Code Playgroud)

请注意,这些副本都是浅拷贝,在这种情况下是好的.要了解浅拷贝和深拷贝之间的区别,请阅读拷贝模块文档.