所以我注意到了另一周通过运行实验,尽管是一种高级语言,你可以通过像这样分配变量来复制变量:
a = 5
b = a
print(b) # 5
b = 3
print(b) # 3
print(a) # 5
...如果你对待词典或者可能以同样的方式列出词典,它就会崩溃!我在我的代码中创建了一个错误,另一周认为字典以相同的方式工作。发现要制作一个适当的深层副本,你需要去:
b = dict(a)
无论如何,我忙于处理日期时间对象并且我操纵它们就好像它们是整数一样,现在开始对这是否合适感到有些紧张。在它工作的地方看起来有点武断,而且它不会在每次运行实验只是为了检查它的行为?可以猜测字符串可能像整数一样工作但不确定行为在哪里发生变化。
可以看到有人has asked about这个用于PHP但是对于Python我倾向于认为任何datetime对象的赋值都是正确的,深层复制并且不会意外地与原始变量混淆。有人有确切消息么?
答案 0 :(得分:14)
由于所有available types in the datetime
module都被记录为 immutable (在说明类的文档之后):
你不应该为此担心。这些类型的对象是不可变的。
日期时间实例上的操作将返回一个新实例,从而不会影响引用前一个实例的任何其他名称。
您可能需要查看PM 2Ring提供的解释facts and myths about how names and values work的链接。这应该可以解释你对名字的任何混淆。
答案 1 :(得分:6)
这没有任何武断。
Python中的所有赋值都是引用。在分配时不会进行任何复制。
如果你有能力改变对象,那么任何突变都会自然地影响对该对象的所有引用。
你原始代码中没有看到整数或字符串的唯一原因是你没有改变对象,你只是重新分配。整数和字符串以及日期时间都没有任何变异方式,因此您唯一能做的就是重新分配它们。如果您重新分配了list,dict或datetime,那么您也不会看到更改传播到其他引用。