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 = pos用old_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[:].
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)
请注意,这些副本都是浅拷贝,在这种情况下是好的.要了解浅拷贝和深拷贝之间的区别,请阅读拷贝模块的文档.
| 归档时间: |
|
| 查看次数: |
2464 次 |
| 最近记录: |