Python copy.deepcopy()函数无法正常工作

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.它是可变的而不是不可变的.

提前致谢.

Joh*_*ann 6

问题是您实际上是在复制类定义而不是类的实例.

代码的另一个问题是属性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)


DSM*_*DSM 2

文档(强调我的):

此版本不复制模块、、函数、方法等类型,也不复制堆栈跟踪、堆栈帧、文件、套接字、窗口、数组或任何类似类型。

您正在尝试复制类,因此:

>>> 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)