日期时间对象需要深层复制吗?

car*_*mom 18 python datetime python-3.x

所以我注意到了另一周通过运行实验,尽管是一种高级语言,你可以通过像这样分配变量来复制变量:

a = 5    
b = a
print(b) # 5
b = 3
print(b) # 3
print(a) # 5
Run Code Online (Sandbox Code Playgroud)

...如果你对待词典或者可能以相同的方式列出词典,它就会失败!我在我的代码中创建了一个错误,另一周认为字典以相同的方式工作.发现要制作一个正确的,深层的副本你需要去:

b = dict(a)
Run Code Online (Sandbox Code Playgroud)

无论如何,我忙于使用日期时间对象而我正在操纵它们就好像它们是整数一样,现在开始对这是否合适感到有些紧张.在它工作的地方看起来有点武断,在它没有的地方,我是否每次只是为了检查它的行为而进行实验?可以猜测字符串可能像整数一样工作,但不确定行为在哪里发生变化.

可以看到有人问过这个用于PHP但是对于Python我倾向于认为任何datetime对象的赋值都是正确的,深度复制并且不会意外地与原始变量混淆.有人有确切消息么?

Jim*_*ard 25

由于模块中的所有可用类型datetime都被记录为不可变的(在说明类的文档之后):

这些类型的对象是不可变的.

你不应该担心这个.

对datetime实例的操作将返回一个新实例,从而不会影响引用前一个实例的任何其他名称.

您可能想看看PM 2Ring提供的链接,它解释了有关名称和值如何工作的事实和神话.这应该可以解释你对名字的任何困惑.


Dan*_*man 9

这没有任何武断之处.

Python中的所有赋值都是引用.在分配时不会进行任何复制.

如果你有能力改变对象,那么任何突变都会自然地影响对该对象的所有引用.

您在原始代码中没有看到整数或字符串的唯一原因是您没有改变对象,只需重新分配即可.整数和字符串以及日期时间都没有任何变异方式,因此您唯一能做的就是重新分配它们.如果您重新分配了list,dict或datetime,那么您也不会看到更改传播到其他引用.

  • 完全正确.这会返回一个新的日期时间,而不是修改现有的日期时间; 新的日期时间将没有任何其他引用,但任何其他引用将继续指向旧的. (3认同)
  • 不,你不明白我说的话.没有办法改变日期时间,所以不可能改变它 - 所以不需要复制.我的观点是重新分配与变异不同,但重新分配对所有对象的工作方式完全相同.没有任何"更多"涉及. (2认同)