在阅读文档时dict.copy(),它说它是字典的浅层副本.我所遵循的书(Beazley的Python参考书)也是如此,它说:
m.copy()方法生成映射对象中包含的项的浅表副本,并将它们放在新的映射对象中.
考虑一下:
>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
所以我假设这会更新original(并添加'c':3)的值,因为我正在做一个浅拷贝.就像你为列表做的那样:
>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
这按预期工作.
由于两者都是浅拷贝,为什么dict.copy()它不能像我期望的那样工作?或者我对浅层和深层复制的理解是有缺陷的?
我希望能够通过调用已实例化的对象上的方法来创建对象的新实例.例如,我有对象:
organism = Organism()
我希望能够调用organism.reproduce()并拥有两个类型为Organism的对象.我的方法在这一点看起来像这样:
class Organism(object):
def reproduce():
organism = Organism()
Run Code Online (Sandbox Code Playgroud)
并且我很确定它不起作用(我甚至不确定如何测试它.我在这篇文章中尝试了gc方法).那么我怎样才能让我的对象创建一个可以访问的副本,就像我创建的第一个对象一样organism = Organism()?
我想制作一个python类对象的副本,它在原始对象发生变化时不会改变.这是我简单的工作示例:
class counterObject:
def __init__(self):
self.Value = 0
def incrementValue(self):
self.Value += 1
def printValue(self):
print(self.Value)
A = counterObject()
A.incrementValue()
A.printValue() #Prints 1
B = A
A.incrementValue()
B.printValue() #Currently prints 2. Want to be 1
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当我设置B = A时,这只意味着B指向对象A.因此,当我改变A时,它也会改变B. 是否有可能使B成为具有与A相同属性的新实例,但是当我更改A时它不会改变?在上面的例子中,当我增加A时,我希望B的值保持为1.
如果A和B是列表而不是对象,我会写B = list(A).我想我问的是类对象是否有类似的方法?
预先感谢您的帮助!
以下代码是我的简单示例,对于每一步,我都会在评论中解释我在做什么,问题在最后。
import pandas as pd
todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date, periods=3, freq='D')
columns = ['A','B','C']
df1 = pd.DataFrame(index=index, columns=columns)
df1 = df1.fillna(1)
# up to here, i've just create a random df1, which looks like the follow:
# A B C
# 2020-03-24 1 1 1
# 2020-03-25 1 1 1
# 2020-03-26 1 1 1
df2 = df1 # here created a copy of df1 named as df2, it should pass by value based on my knowledge
df1 …Run Code Online (Sandbox Code Playgroud)