Ram*_*uer 3 python copy reference class mutable
我一直在玩deepcopy功能和复制功能,我对它们都有同样的问题.这就像副本是一个引用(或指针)而不是正确的副本.我正在使用Python中的数据记录(类),也许它可能是..我给你看一个例子:
>>> import copy
>>> class player1:
... age = 23
... score = 1
>>> class player2:
... age = 14
... score = 2
>>> player3 = copy.deepcopy(player1)
Run Code Online (Sandbox Code Playgroud)
我打印参数.
>>> print player1.age, player1.score
23 1
>>> print player2.age, player2.score
14 2
>>> print player3.age, player3.score
23 1
Run Code Online (Sandbox Code Playgroud)
现在我在player1数据记录中增加score参数.
>>> player1.score += 3
Run Code Online (Sandbox Code Playgroud)
然后我再次打印结果.
>>> print player1.age, player1.score
23 4
>>> print player2.age, player2.score
14 2
>>> print player3.age, player3.score
23 4
Run Code Online (Sandbox Code Playgroud)
为什么玩家3会改变?我只是增加了player1中的参数,而不是player3.它是可变的而不是不可变的.
提前致谢.
问题是您实际上是在复制类定义而不是类的实例.
代码的另一个问题是属性age并且score是类的一部分,并且将在该类的所有实例之间共享.这可能不是你想要的.
你可能想做的是:
import copy
class Player:
def __init__(self, age, score):
self.age = age
self.score = score
player1 = Player(23, 1)
player2 = Player(14, 2)
player3 = copy.deepcopy(player1)
player1.age += 1
print "player1.age", player1.age
print "player3.age", player3.age
Run Code Online (Sandbox Code Playgroud)
这可以满足您的期望:
player1.age 24
player3.age 23
Run Code Online (Sandbox Code Playgroud)
从文档(强调我的):
此版本不复制模块、类、函数、方法等类型,也不复制堆栈跟踪、堆栈帧、文件、套接字、窗口、数组或任何类似类型。
您正在尝试复制类,因此:
>>> player3 = copy.deepcopy(player1)
>>> player1 is player3
True
Run Code Online (Sandbox Code Playgroud)
但
>>> p1 = player1()
>>> p2 = player2()
>>> p3 = copy.deepcopy(p1)
>>> p1 is p3
False
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6521 次 |
| 最近记录: |